/ Hex Artifact Content
Login

Artifact e75c3c1d6534265f74a4763282f17e9ad946606ef0a68c5517fcfb355cc243d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70  SchemaWritable(p
26e0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
26f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
2700: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2710: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
2720: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25 73 28  ATE TABLE %Q.%s(
2730: 25 73 29 22 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  %s)", pDb->zDbSN
2740: 61 6d 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c  ame, zTab, aTabl
2750: 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20  e[i].zCols.     
2760: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 52     );.        aR
2770: 6f 6f 74 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  oot[i] = pParse-
2780: 3e 72 65 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20  >regRoot;.      
2790: 20 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 20    aCreateTbl[i] 
27a0: 3d 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  = OPFLAG_P2ISREG
27b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
27c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
27d0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
27e0: 65 78 69 73 74 73 2e 20 49 66 20 7a 57 68 65 72  exists. If zWher
27f0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64  e is not NULL, d
2800: 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65  elete all entrie
2810: 73 20 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f  s .      ** asso
2820: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2830: 74 61 62 6c 65 20 7a 57 68 65 72 65 2e 20 49 66  table zWhere. If
2840: 20 7a 57 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c   zWhere is NULL,
2850: 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
2860: 20 20 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74    ** entire cont
2870: 65 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ents of the tabl
2880: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f  e. */.      aRoo
2890: 74 5b 69 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e  t[i] = pStat->tn
28a0: 75 6d 3b 0a 20 20 20 20 20 20 61 43 72 65 61 74  um;.      aCreat
28b0: 65 54 62 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  eTbl[i] = 0;.   
28c0: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
28d0: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
28e0: 20 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54   aRoot[i], 1, zT
28f0: 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ab);.      if( z
2900: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20  Where ){.       
2910: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2920: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
2930: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
2940: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
2950: 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
2960: 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
2970: 2c 20 7a 54 61 62 2c 20 7a 57 68 65 72 65 54 79  , zTab, zWhereTy
2980: 70 65 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20  pe, zWhere.     
2990: 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c     );.#ifdef SQL
29a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
29b0: 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 20 20  DATE_HOOK.      
29c0: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 78 50  }else if( db->xP
29d0: 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
29e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29f0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
2a00: 50 61 72 73 65 2c 20 22 44 45 4c 45 54 45 20 46  Parse, "DELETE F
2a10: 52 4f 4d 20 25 51 2e 25 73 22 2c 20 70 44 62 2d  ROM %Q.%s", pDb-
2a20: 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 29  >zDbSName, zTab)
2a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
2a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2a50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
2a60: 5b 31 33 34 5d 20 74 61 62 6c 65 20 61 6c 72 65  [134] table alre
2a70: 61 64 79 20 65 78 69 73 74 73 2e 20 20 44 65 6c  ady exists.  Del
2a80: 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e 20 2a 2f  ete all rows. */
2a90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2aa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ab0: 5f 43 6c 65 61 72 2c 20 61 52 6f 6f 74 5b 69 5d  _Clear, aRoot[i]
2ac0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
2ad0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ae0: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
2af0: 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 73  stat[134] tables
2b00: 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2b10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 54 61 62  .  for(i=0; aTab
2b20: 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b 20 69 2b 2b  le[i].zCols; i++
2b30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
2b40: 3c 41 72 72 61 79 53 69 7a 65 28 61 54 61 62 6c  <ArraySize(aTabl
2b50: 65 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e) );.    sqlite
2b60: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2b70: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
2b80: 69 53 74 61 74 43 75 72 2b 69 2c 20 61 52 6f 6f  iStatCur+i, aRoo
2b90: 74 5b 69 5d 2c 20 69 44 62 2c 20 33 29 3b 0a 20  t[i], iDb, 3);. 
2ba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2bb0: 61 6e 67 65 50 35 28 76 2c 20 61 43 72 65 61 74  angeP5(v, aCreat
2bc0: 65 54 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 56 64  eTbl[i]);.    Vd
2bd0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 61 54  beComment((v, aT
2be0: 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b  able[i].zName));
2bf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2c00: 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65 72  commended number
2c10: 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72 20   of samples for 
2c20: 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f 0a  sqlite_stat4.*/.
2c30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
2c40: 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20 64  TAT4_SAMPLES.# d
2c50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41  efine SQLITE_STA
2c60: 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23 65  T4_SAMPLES 24.#e
2c70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65  ndif../*.** Thre
2c80: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  e SQL functions 
2c90: 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20 73  - stat_init(), s
2ca0: 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64 20  tat_push(), and 
2cb0: 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a 20  stat_get() -.** 
2cc0: 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e 63  share an instanc
2cd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2ce0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ng structure to 
2cf0: 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74 65  hold their state
2d00: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  .** information.
2d10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2d20: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53 74  ct Stat4Accum St
2d30: 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64 65  at4Accum;.typede
2d40: 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53 61  f struct Stat4Sa
2d50: 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c 65  mple Stat4Sample
2d60: 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53 61  ;.struct Stat4Sa
2d70: 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e 74  mple {.  tRowcnt
2d80: 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20 20   *anEq;         
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2da0: 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f 0a  te_stat4.nEq */.
2db0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74    tRowcnt *anDLt
2dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dd0: 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74    /* sqlite_stat
2de0: 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65 66  4.nDLt */.#ifdef
2df0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2e00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2e10: 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20 20  tRowcnt *anLt;  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34 2e  /* sqlite_stat4.
2e40: 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  nLt */.  union {
2e50: 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 6e       /* Rowid in
2e80: 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20 74   main table of t
2e90: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75 38  he key */.    u8
2ea0: 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20 20   *aRowid;       
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec0: 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55 54   Key for WITHOUT
2ed0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
2ee0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e 52  .  } u;.  u32 nR
2ef0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2f10: 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f 0a  eof aRowid[] */.
2f20: 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b 20    u8 isPSample; 
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
2f50: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a  eriodic sample *
2f60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53 61      /* If !isPSa
2f90: 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f 6e  mple, the reason
2fa0: 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a   for inclusion *
2fb0: 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20 20  /.  u32 iHash;  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b 65      /* Tiebreake
2fe0: 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69 66  r hash */.#endif
2ff0: 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20 53         .struct S
3030: 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74 52  tat4Accum {.  tR
3040: 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20  owcnt nRow;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3060: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
3070: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
3080: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d  .  tRowcnt nPSam
3090: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ple;         /* 
30a0: 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20  How often to do 
30b0: 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  a periodic sampl
30c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  e */.  int nCol;
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
30f0: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2b  lumns in index +
3100: 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69   pk/rowid */.  i
3110: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3130: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
3140: 6d 6e 73 20 77 2f 6f 20 74 68 65 20 70 6b 2f 72  mns w/o the pk/r
3150: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  owid */.  int mx
3160: 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20  Sample;         
3170: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
3180: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
3190: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 2a   to accumulate *
31a0: 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20  /.  Stat4Sample 
31b0: 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f 2a  current;      /*
31c0: 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73 20   Current row as 
31d0: 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 2f  a Stat4Sample */
31e0: 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20 20  .  u32 iPrn;    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3200: 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75  Pseudo-random nu
3210: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73 61  mber used for sa
3220: 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61 74  mpling */.  Stat
3230: 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b 20  4Sample *aBest; 
3240: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
3250: 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61 6d 70  f nCol best samp
3260: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  les */.  int iMi
3270: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3280: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
3290: 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69 74 68  [] of entry with
32a0: 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65 20 2a   minimum score *
32b0: 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b  /.  int nSample;
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d0: 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   Current number 
32e0: 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20  of samples */.  
32f0: 69 6e 74 20 6e 4d 61 78 45 71 5a 65 72 6f 3b 20  int nMaxEqZero; 
3300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
3310: 20 6c 65 61 64 69 6e 67 20 30 20 69 6e 20 61 6e   leading 0 in an
3320: 45 71 5b 5d 20 66 6f 72 20 61 6e 79 20 61 5b 5d  Eq[] for any a[]
3330: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
3340: 69 47 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  iGet;           
3350: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
3360: 66 20 63 75 72 72 65 6e 74 20 73 61 6d 70 6c 65  f current sample
3370: 20 61 63 63 65 73 73 65 64 20 62 79 20 73 74 61   accessed by sta
3380: 74 5f 67 65 74 28 29 20 2a 2f 0a 20 20 53 74 61  t_get() */.  Sta
3390: 74 34 53 61 6d 70 6c 65 20 2a 61 3b 20 20 20 20  t4Sample *a;    
33a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
33b0: 6f 66 20 6d 78 53 61 6d 70 6c 65 20 53 74 61 74  of mxSample Stat
33c0: 34 53 61 6d 70 6c 65 20 6f 62 6a 65 63 74 73 20  4Sample objects 
33d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
33f0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
3400: 63 74 69 6f 6e 2c 20 66 6f 72 20 6d 61 6c 6c 6f  ction, for mallo
3410: 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65  c() */.};../* Re
3420: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 75 73 65  claim memory use
3430: 64 20 62 79 20 61 20 53 74 61 74 34 53 61 6d 70  d by a Stat4Samp
3440: 6c 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  le.*/.#ifdef SQL
3450: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3460: 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63  _OR_STAT4.static
3470: 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6c 65 61   void sampleClea
3480: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  r(sqlite3 *db, S
3490: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 29 7b 0a  tat4Sample *p){.
34a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
34b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77  );.  if( p->nRow
34c0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
34d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
34e0: 2e 61 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 2d  .aRowid);.    p-
34f0: 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d  >nRowid = 0;.  }
3500: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e  .}.#endif../* In
3510: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 42 4c 4f  itialize the BLO
3520: 42 20 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57  B value of a ROW
3530: 49 44 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ID.*/.#ifdef SQL
3540: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3550: 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63  _OR_STAT4.static
3560: 20 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52   void sampleSetR
3570: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
3580: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
3590: 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 75  , int n, const u
35a0: 38 20 2a 70 44 61 74 61 29 7b 0a 20 20 61 73 73  8 *pData){.  ass
35b0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
35c0: 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29 20  if( p->nRowid ) 
35d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
35e0: 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a  , p->u.aRowid);.
35f0: 20 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 3d 20    p->u.aRowid = 
3600: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3610: 61 77 4e 4e 28 64 62 2c 20 6e 29 3b 0a 20 20 69  awNN(db, n);.  i
3620: 66 28 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 29  f( p->u.aRowid )
3630: 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20  {.    p->nRowid 
3640: 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = n;.    memcpy(
3650: 70 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 44 61  p->u.aRowid, pDa
3660: 74 61 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  ta, n);.  }else{
3670: 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d  .    p->nRowid =
3680: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
3690: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
36a0: 74 68 65 20 49 4e 54 45 47 45 52 20 76 61 6c 75  the INTEGER valu
36b0: 65 20 6f 66 20 61 20 52 4f 57 49 44 2e 0a 2a 2f  e of a ROWID..*/
36c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
36d0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
36e0: 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69 64  TAT4.static void
36f0: 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 49   sampleSetRowidI
3700: 6e 74 36 34 28 73 71 6c 69 74 65 33 20 2a 64 62  nt64(sqlite3 *db
3710: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
3720: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
3730: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3740: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69  ;.  if( p->nRowi
3750: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
3760: 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69  e(db, p->u.aRowi
3770: 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f 77 69 64 20  d);.  p->nRowid 
3780: 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e 69 52 6f 77  = 0;.  p->u.iRow
3790: 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23  id = iRowid;.}.#
37a0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  endif.../*.** Co
37b0: 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
37c0: 6f 66 20 6f 62 6a 65 63 74 20 28 2a 70 46 72 6f  of object (*pFro
37d0: 6d 29 20 69 6e 74 6f 20 28 2a 70 54 6f 29 2e 0a  m) into (*pTo)..
37e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
37f0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
3800: 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f  _STAT4.static vo
3810: 69 64 20 73 61 6d 70 6c 65 43 6f 70 79 28 53 74  id sampleCopy(St
3820: 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74 61  at4Accum *p, Sta
3830: 74 34 53 61 6d 70 6c 65 20 2a 70 54 6f 2c 20 53  t4Sample *pTo, S
3840: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 46 72 6f  tat4Sample *pFro
3850: 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69 73 50 53 61  m){.  pTo->isPSa
3860: 6d 70 6c 65 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  mple = pFrom->is
3870: 50 53 61 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d 3e  PSample;.  pTo->
3880: 69 43 6f 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69 43  iCol = pFrom->iC
3890: 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69 48 61 73 68  ol;.  pTo->iHash
38a0: 20 3d 20 70 46 72 6f 6d 2d 3e 69 48 61 73 68 3b   = pFrom->iHash;
38b0: 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
38c0: 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45 71  nEq, pFrom->anEq
38d0: 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  , sizeof(tRowcnt
38e0: 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65  )*p->nCol);.  me
38f0: 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c 20  mcpy(pTo->anLt, 
3900: 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69 7a  pFrom->anLt, siz
3910: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e  eof(tRowcnt)*p->
3920: 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  nCol);.  memcpy(
3930: 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20 70 46 72 6f  pTo->anDLt, pFro
3940: 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69 7a 65 6f 66  m->anDLt, sizeof
3950: 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f  (tRowcnt)*p->nCo
3960: 6c 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  l);.  if( pFrom-
3970: 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73  >nRowid ){.    s
3980: 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 28 70 2d  ampleSetRowid(p-
3990: 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  >db, pTo, pFrom-
39a0: 3e 6e 52 6f 77 69 64 2c 20 70 46 72 6f 6d 2d 3e  >nRowid, pFrom->
39b0: 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  u.aRowid);.  }el
39c0: 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53 65  se{.    sampleSe
39d0: 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e 64  tRowidInt64(p->d
39e0: 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 75  b, pTo, pFrom->u
39f0: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d 0a  .iRowid);.  }.}.
3a00: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
3a10: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
3a20: 20 6f 66 20 61 20 53 74 61 74 34 41 63 63 75 6d   of a Stat4Accum
3a30: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3a40: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 34  tatic void stat4
3a50: 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20  Destructor(void 
3a60: 2a 70 4f 6c 64 29 7b 0a 20 20 53 74 61 74 34 41  *pOld){.  Stat4A
3a70: 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34  ccum *p = (Stat4
3a80: 41 63 63 75 6d 2a 29 70 4f 6c 64 3b 0a 23 69 66  Accum*)pOld;.#if
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3aa0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
3ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
3ac0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
3ad0: 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61 72  i++) sampleClear
3ae0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 42 65 73 74  (p->db, p->aBest
3af0: 2b 69 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  +i);.  for(i=0; 
3b00: 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20 69  i<p->mxSample; i
3b10: 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61 72 28  ++) sampleClear(
3b20: 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b 69 29 3b 0a  p->db, p->a+i);.
3b30: 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d    sampleClear(p-
3b40: 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74  >db, &p->current
3b50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
3b60: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
3b70: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   p);.}../*.** Im
3b80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3b90: 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28 4e 2c  the stat_init(N,
3ba0: 4b 2c 43 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  K,C) SQL functio
3bb0: 6e 2e 20 54 68 65 20 74 68 72 65 65 20 70 61 72  n. The three par
3bc0: 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 3a 0a  ameters.** are:.
3bd0: 2a 2a 20 20 20 20 20 4e 3a 20 20 20 20 54 68 65  **     N:    The
3be0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
3bf0: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
3c00: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f  including the ro
3c10: 77 69 64 2f 70 6b 20 28 6e 6f 74 65 20 31 29 0a  wid/pk (note 1).
3c20: 2a 2a 20 20 20 20 20 4b 3a 20 20 20 20 54 68 65  **     K:    The
3c30: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
3c40: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
3c50: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f  excluding the ro
3c60: 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20 20 20 20 43  wid/pk..**     C
3c70: 3a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20  :    The number 
3c80: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
3c90: 6e 64 65 78 20 28 6e 6f 74 65 20 32 29 0a 2a 2a  ndex (note 2).**
3ca0: 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20 20 49 6e 20  .** Note 1:  In 
3cb0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
3cc0: 20 6f 66 20 74 68 65 20 63 6f 76 65 72 69 6e 67   of the covering
3cd0: 20 69 6e 64 65 78 20 74 68 61 74 20 69 6d 70 6c   index that impl
3ce0: 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 57 49 54 48  ements a.** WITH
3cf0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
3d00: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
3d10: 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20   of PRIMARY KEY 
3d20: 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74 20 74 68 65  columns, not the
3d30: 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
3d40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3d50: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
3d60: 4e 6f 74 65 20 32 3a 20 20 43 20 69 73 20 6f 6e  Note 2:  C is on
3d70: 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41 54  ly used for STAT
3d80: 33 20 61 6e 64 20 53 54 41 54 34 2e 0a 2a 2a 0a  3 and STAT4..**.
3d90: 2a 2a 20 46 6f 72 20 69 6e 64 65 78 65 73 20 6f  ** For indexes o
3da0: 6e 20 6f 72 64 69 6e 61 72 79 20 72 6f 77 69 64  n ordinary rowid
3db0: 20 74 61 62 6c 65 73 2c 20 4e 3d 3d 4b 2b 31 2e   tables, N==K+1.
3dc0: 20 20 42 75 74 20 66 6f 72 20 69 6e 64 65 78 65    But for indexe
3dd0: 73 20 6f 6e 0a 2a 2a 20 57 49 54 48 4f 55 54 20  s on.** WITHOUT 
3de0: 52 4f 57 49 44 20 74 61 62 6c 65 73 2c 20 4e 3d  ROWID tables, N=
3df0: 4b 2b 50 20 77 68 65 72 65 20 50 20 69 73 20 74  K+P where P is t
3e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3e10: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 50  umns in the.** P
3e20: 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 74 68  RIMARY KEY of th
3e30: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
3e40: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61  vering index tha
3e50: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
3e60: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 57 49 54  .** original WIT
3e70: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
3e80: 20 61 73 20 4e 3d 3d 4b 20 61 73 20 61 20 73 70   as N==K as a sp
3e90: 65 63 69 61 6c 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ecial case..**.*
3ea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
3eb0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 53 74 61  llocates the Sta
3ec0: 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 69  t4Accum object i
3ed0: 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54  n heap memory. T
3ee0: 68 65 20 72 65 74 75 72 6e 20 0a 2a 2a 20 76 61  he return .** va
3ef0: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
3f00: 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63   to the Stat4Acc
3f10: 75 6d 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  um object.  The 
3f20: 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65 0a  datatype of the.
3f30: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
3f40: 69 73 20 42 4c 4f 42 2c 20 62 75 74 20 69 74 20  is BLOB, but it 
3f50: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
3f60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3f70: 53 74 61 74 34 41 63 63 75 6d 0a 2a 2a 20 6f 62  Stat4Accum.** ob
3f80: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3f90: 76 6f 69 64 20 73 74 61 74 49 6e 69 74 28 0a 20  void statInit(. 
3fa0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3fb0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
3fc0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
3fd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
3fe0: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
3ff0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  ;.  int nCol;   
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4020: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65   columns in inde
4030: 78 20 62 65 69 6e 67 20 73 61 6d 70 6c 65 64 20  x being sampled 
4040: 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c  */.  int nKeyCol
4050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4060: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4070: 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f  f key columns */
4080: 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70 3b 20 20  .  int nColUp;  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f 75 6e 64     /* nCol round
40b0: 65 64 20 75 70 20 66 6f 72 20 61 6c 69 67 6e 6d  ed up for alignm
40c0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ent */.  int n; 
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
40f0: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
4100: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69  locate */.  sqli
4110: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4130: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4140: 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  on */.#ifdef SQL
4150: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
4160: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20  _OR_STAT4.  int 
4170: 6d 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49 54  mxSample = SQLIT
4180: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 3b  E_STAT4_SAMPLES;
4190: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
41a0: 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 66  code the three f
41b0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
41c0: 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  s */.  UNUSED_PA
41d0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
41e0: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
41f0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
4200: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ]);.  assert( nC
4210: 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43 6f 6c 55 70  ol>0 );.  nColUp
4220: 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e   = sizeof(tRowcn
4230: 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b 31 29 26  t)<8 ? (nCol+1)&
4240: 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20 20 6e 4b 65  ~1 : nCol;.  nKe
4250: 79 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  yCol = sqlite3_v
4260: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
4270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
4280: 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29 3b 0a 20 20  yCol<=nCol );.  
4290: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
42a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
42b0: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72 65  ate the space re
42c0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 53  quired for the S
42d0: 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat4Accum object
42e0: 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f 66   */.  n = sizeof
42f0: 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a 65  (*p) .    + size
4300: 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
4310: 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Up              
4320: 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75      /* Stat4Accu
4330: 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b 20  m.anEq */.    + 
4340: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
4350: 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20  nColUp          
4360: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34          /* Stat4
4370: 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a 23  Accum.anDLt */.#
4380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4390: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
43a0: 54 34 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  T4.    + sizeof(
43b0: 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70 20  tRowcnt)*nColUp 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 61   /* Stat4Accum.a
43e0: 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a  nLt */.    + siz
43f0: 65 6f 66 28 53 74 61 74 34 53 61 6d 70 6c 65 29  eof(Stat4Sample)
4400: 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65 29  *(nCol+mxSample)
4410: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
4420: 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61 5b 5d 20  um.aBest[], a[] 
4430: 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  */.    + sizeof(
4440: 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43 6f 6c 55  tRowcnt)*3*nColU
4450: 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65  p*(nCol+mxSample
4460: 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a 20 20 64  ).#endif.  ;.  d
4470: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
4480: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
4490: 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d 20 73 71  ntext);.  p = sq
44a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
44b0: 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28 20  o(db, n);.  if( 
44c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
44d0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
44e0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
44f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4500: 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ..  p->db = db;.
4510: 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a 20    p->nRow = 0;. 
4520: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b   p->nCol = nCol;
4530: 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  .  p->nKeyCol = 
4540: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 2d 3e 63 75  nKeyCol;.  p->cu
4550: 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d 20 28 74  rrent.anDLt = (t
4560: 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20  Rowcnt*)&p[1];. 
4570: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
4580: 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e 61   = &p->current.a
4590: 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a 23  nDLt[nColUp];..#
45a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
45b0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
45c0: 54 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70  T4.  {.    u8 *p
45d0: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
45e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
45f0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e 6f  located space no
4600: 74 20 79 65 74 20 61 73 73 69 67 6e 65 64 20 2a  t yet assigned *
4610: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
4640: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
4650: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f   p->aSample[] */
4660: 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20  ..    p->iGet = 
4670: 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61 6d  -1;.    p->mxSam
4680: 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b 0a  ple = mxSample;.
4690: 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65 20      p->nPSample 
46a0: 3d 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c 69  = (tRowcnt)(sqli
46b0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
46c0: 61 72 67 76 5b 32 5d 29 2f 28 6d 78 53 61 6d 70  argv[2])/(mxSamp
46d0: 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20 20  le/3+1) + 1);.  
46e0: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c    p->current.anL
46f0: 74 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e  t = &p->current.
4700: 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20 20  anEq[nColUp];.  
4710: 20 20 70 2d 3e 69 50 72 6e 20 3d 20 30 78 36 38    p->iPrn = 0x68
4720: 39 65 39 36 32 64 2a 28 75 33 32 29 6e 43 6f 6c  9e962d*(u32)nCol
4730: 20 5e 20 30 78 64 30 39 34 34 35 36 35 2a 28 75   ^ 0xd0944565*(u
4740: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
4750: 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  _int(argv[2]);. 
4760: 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20   .    /* Set up 
4770: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e 61  the Stat4Accum.a
4780: 5b 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20 61  [] and aBest[] a
4790: 72 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d 3e  rrays */.    p->
47a0: 61 20 3d 20 28 73 74 72 75 63 74 20 53 74 61 74  a = (struct Stat
47b0: 34 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75 72  4Sample*)&p->cur
47c0: 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55 70  rent.anLt[nColUp
47d0: 5d 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74 20  ];.    p->aBest 
47e0: 3d 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65  = &p->a[mxSample
47f0: 5d 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20  ];.    pSpace = 
4800: 28 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53 61  (u8*)(&p->a[mxSa
4810: 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20 20  mple+nCol]);.   
4820: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78 53   for(i=0; i<(mxS
4830: 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b 2b  ample+nCol); i++
4840: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  ){.      p->a[i]
4850: 2e 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e 74  .anEq = (tRowcnt
4860: 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63   *)pSpace; pSpac
4870: 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f  e += (sizeof(tRo
4880: 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b  wcnt) * nColUp);
4890: 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61  .      p->a[i].a
48a0: 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a  nLt = (tRowcnt *
48b0: 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20  )pSpace; pSpace 
48c0: 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  += (sizeof(tRowc
48d0: 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20  nt) * nColUp);. 
48e0: 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44       p->a[i].anD
48f0: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29  Lt = (tRowcnt *)
4900: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
4910: 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  = (sizeof(tRowcn
4920: 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20  t) * nColUp);.  
4930: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
4940: 28 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29 70  (pSpace - (u8*)p
4950: 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20 66  )==n );.  .    f
4960: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
4970: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
4980: 42 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20 69  Best[i].iCol = i
4990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
49a0: 69 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  if..  /* Return 
49b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
49c0: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63   allocated objec
49d0: 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  t to the caller.
49e0: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
49f0: 20 6f 6e 6c 79 20 74 68 65 20 70 6f 69 6e 74 65   only the pointe
4a00: 72 20 28 74 68 65 20 32 6e 64 20 70 61 72 61 6d  r (the 2nd param
4a10: 65 74 65 72 29 20 6d 61 74 74 65 72 73 2e 20 20  eter) matters.  
4a20: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
4a30: 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 28 67 69 76  object.  ** (giv
4a40: 65 6e 20 62 79 20 74 68 65 20 33 72 64 20 70 61  en by the 3rd pa
4a50: 72 61 6d 65 74 65 72 29 20 69 73 20 6e 65 76 65  rameter) is neve
4a60: 72 20 75 73 65 64 20 61 6e 64 20 63 61 6e 20 62  r used and can b
4a70: 65 20 61 6e 79 20 70 6f 73 69 74 69 76 65 0a 20  e any positive. 
4a80: 20 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20   ** value. */.  
4a90: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
4aa0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  lob(context, p, 
4ab0: 73 69 7a 65 6f 66 28 2a 70 29 2c 20 73 74 61 74  sizeof(*p), stat
4ac0: 34 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 7d 0a  4Destructor);.}.
4ad0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
4ae0: 63 44 65 66 20 73 74 61 74 49 6e 69 74 46 75 6e  cDef statInitFun
4af0: 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b 49 73 53  cdef = {.  2+IsS
4b00: 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e  tat34,      /* n
4b10: 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  Arg */.  SQLITE_
4b20: 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e  UTF8,     /* fun
4b30: 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20  cFlags */.  0,  
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b50: 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30  pUserData */.  0
4b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b70: 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74  /* pNext */.  st
4b80: 61 74 49 6e 69 74 2c 20 20 20 20 20 20 20 20 2f  atInit,        /
4b90: 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30 2c  * xSFunc */.  0,
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4bb0: 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20  * xFinalize */. 
4bc0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
4bd0: 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20 78 49 6e    /* xValue, xIn
4be0: 76 65 72 73 65 20 2a 2f 0a 20 20 22 73 74 61 74  verse */.  "stat
4bf0: 5f 69 6e 69 74 22 2c 20 20 20 20 20 2f 2a 20 7a  _init",     /* z
4c00: 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b  Name */.  {0}.};
4c10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4c20: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a  ENABLE_STAT4./*.
4c30: 2a 2a 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c 64  ** pNew and pOld
4c40: 20 61 72 65 20 62 6f 74 68 20 63 61 6e 64 69 64   are both candid
4c50: 61 74 65 20 6e 6f 6e 2d 70 65 72 69 6f 64 69 63  ate non-periodic
4c60: 20 73 61 6d 70 6c 65 73 20 73 65 6c 65 63 74 65   samples selecte
4c70: 64 20 66 6f 72 20 0a 2a 2a 20 74 68 65 20 73 61  d for .** the sa
4c80: 6d 65 20 63 6f 6c 75 6d 6e 20 28 70 4e 65 77 2d  me column (pNew-
4c90: 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f  >iCol==pOld->iCo
4ca0: 6c 29 2e 20 49 67 6e 6f 72 69 6e 67 20 74 68 69  l). Ignoring thi
4cb0: 73 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 0a 2a 2a  s column and .**
4cc0: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f 6e 6c   considering onl
4cd0: 79 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 63  y any trailing c
4ce0: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 73  olumns and the s
4cf0: 61 6d 70 6c 65 20 68 61 73 68 20 76 61 6c 75 65  ample hash value
4d00: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
4d10: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
4d20: 69 66 20 73 61 6d 70 6c 65 20 70 4e 65 77 20 69  if sample pNew i
4d30: 73 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65  s to be preferre
4d40: 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 20  d over pOld..** 
4d50: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
4d60: 69 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  if we assume tha
4d70: 74 20 74 68 65 20 63 61 72 64 69 6e 61 6c 69 74  t the cardinalit
4d80: 69 65 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ies of the selec
4d90: 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 6f  ted.** column fo
4da0: 72 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c 64 20  r pNew and pOld 
4db0: 61 72 65 20 65 71 75 61 6c 2c 20 69 73 20 70 4e  are equal, is pN
4dc0: 65 77 20 74 6f 20 62 65 20 70 72 65 66 65 72 72  ew to be preferr
4dd0: 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a  ed over pOld..**
4de0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4df0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 66  n assumes that f
4e00: 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  or each argument
4e10: 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e   sample, the con
4e20: 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tents of.** the 
4e30: 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f  anEq[] array fro
4e40: 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b  m pSample->anEq[
4e50: 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 2b 31 5d  pSample->iCol+1]
4e60: 20 6f 6e 77 61 72 64 73 20 61 72 65 20 76 61 6c   onwards are val
4e70: 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id. .*/.static i
4e80: 6e 74 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  nt sampleIsBette
4e90: 72 50 6f 73 74 28 0a 20 20 53 74 61 74 34 41 63  rPost(.  Stat4Ac
4ea0: 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20 0a 20 20  cum *pAccum, .  
4eb0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65  Stat4Sample *pNe
4ec0: 77 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c  w, .  Stat4Sampl
4ed0: 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20 69 6e 74  e *pOld.){.  int
4ee0: 20 6e 43 6f 6c 20 3d 20 70 41 63 63 75 6d 2d 3e   nCol = pAccum->
4ef0: 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nCol;.  int i;. 
4f00: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 69   assert( pNew->i
4f10: 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20  Col==pOld->iCol 
4f20: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4e 65 77 2d  );.  for(i=pNew-
4f30: 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e 43 6f 6c 3b  >iCol+1; i<nCol;
4f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4f50: 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3e 70 4f 6c  New->anEq[i]>pOl
4f60: 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72 65 74  d->anEq[i] ) ret
4f70: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 70  urn 1;.    if( p
4f80: 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3c 70 4f 6c  New->anEq[i]<pOl
4f90: 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72 65 74  d->anEq[i] ) ret
4fa0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
4fb0: 20 70 4e 65 77 2d 3e 69 48 61 73 68 3e 70 4f 6c   pNew->iHash>pOl
4fc0: 64 2d 3e 69 48 61 73 68 20 29 20 72 65 74 75 72  d->iHash ) retur
4fd0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
4fe0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
4ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5000: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
5010: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
5020: 20 69 66 20 70 4e 65 77 20 69 73 20 74 6f 20 62   if pNew is to b
5030: 65 20 70 72 65 66 65 72 72 65 64 20 6f 76 65 72  e preferred over
5040: 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pOld..**.** Thi
5050: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
5060: 65 73 20 74 68 61 74 20 66 6f 72 20 65 61 63 68  es that for each
5070: 20 61 72 67 75 6d 65 6e 74 20 73 61 6d 70 6c 65   argument sample
5080: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
5090: 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71 5b 5d 20  f.** the anEq[] 
50a0: 61 72 72 61 79 20 66 72 6f 6d 20 70 53 61 6d 70  array from pSamp
50b0: 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d 70 6c 65  le->anEq[pSample
50c0: 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61 72 64 73 20  ->iCol] onwards 
50d0: 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73  are valid. .*/.s
50e0: 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70 6c 65  tatic int sample
50f0: 49 73 42 65 74 74 65 72 28 0a 20 20 53 74 61 74  IsBetter(.  Stat
5100: 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20  4Accum *pAccum, 
5110: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
5120: 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53 61  pNew, .  Stat4Sa
5130: 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20  mple *pOld.){.  
5140: 74 52 6f 77 63 6e 74 20 6e 45 71 4e 65 77 20 3d  tRowcnt nEqNew =
5150: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77   pNew->anEq[pNew
5160: 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74 52 6f 77 63  ->iCol];.  tRowc
5170: 6e 74 20 6e 45 71 4f 6c 64 20 3d 20 70 4f 6c 64  nt nEqOld = pOld
5180: 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d 3e 69 43 6f  ->anEq[pOld->iCo
5190: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  l];..  assert( p
51a0: 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d  Old->isPSample==
51b0: 30 20 26 26 20 70 4e 65 77 2d 3e 69 73 50 53 61  0 && pNew->isPSa
51c0: 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mple==0 );.  ass
51d0: 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20  ert( IsStat4 || 
51e0: 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 30 20 26  (pNew->iCol==0 &
51f0: 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3d 3d 30 29  & pOld->iCol==0)
5200: 20 29 3b 0a 0a 20 20 69 66 28 20 28 6e 45 71 4e   );..  if( (nEqN
5210: 65 77 3e 6e 45 71 4f 6c 64 29 20 29 20 72 65 74  ew>nEqOld) ) ret
5220: 75 72 6e 20 31 3b 0a 23 69 66 64 65 66 20 53 51  urn 1;.#ifdef SQ
5230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
5240: 34 0a 20 20 69 66 28 20 6e 45 71 4e 65 77 3d 3d  4.  if( nEqNew==
5250: 6e 45 71 4f 6c 64 20 29 7b 0a 20 20 20 20 69 66  nEqOld ){.    if
5260: 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3c 70 4f 6c  ( pNew->iCol<pOl
5270: 64 2d 3e 69 43 6f 6c 20 29 20 72 65 74 75 72 6e  d->iCol ) return
5280: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   1;.    return (
5290: 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64  pNew->iCol==pOld
52a0: 2d 3e 69 43 6f 6c 20 26 26 20 73 61 6d 70 6c 65  ->iCol && sample
52b0: 49 73 42 65 74 74 65 72 50 6f 73 74 28 70 41 63  IsBetterPost(pAc
52c0: 63 75 6d 2c 20 70 4e 65 77 2c 20 70 4f 6c 64 29  cum, pNew, pOld)
52d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
52e0: 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  0;.#else.  retur
52f0: 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c  n (nEqNew==nEqOl
5300: 64 20 26 26 20 70 4e 65 77 2d 3e 69 48 61 73 68  d && pNew->iHash
5310: 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 29 3b 0a 23  >pOld->iHash);.#
5320: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
5330: 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
5340: 20 6f 66 20 73 61 6d 70 6c 65 20 2a 70 4e 65 77   of sample *pNew
5350: 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 61 5b 5d   into the p->a[]
5360: 20 61 72 72 61 79 2e 20 49 66 20 6e 65 63 65 73   array. If neces
5370: 73 61 72 79 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  sary,.** remove 
5380: 74 68 65 20 6c 65 61 73 74 20 64 65 73 69 72 61  the least desira
5390: 62 6c 65 20 73 61 6d 70 6c 65 20 66 72 6f 6d 20  ble sample from 
53a0: 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61 6b 65 20 72  p->a[] to make r
53b0: 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oom..*/.static v
53c0: 6f 69 64 20 73 61 6d 70 6c 65 49 6e 73 65 72 74  oid sampleInsert
53d0: 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20  (Stat4Accum *p, 
53e0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65  Stat4Sample *pNe
53f0: 77 2c 20 69 6e 74 20 6e 45 71 5a 65 72 6f 29 7b  w, int nEqZero){
5400: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
5410: 70 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 69  pSample = 0;.  i
5420: 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
5430: 20 49 73 53 74 61 74 34 20 7c 7c 20 6e 45 71 5a   IsStat4 || nEqZ
5440: 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23 69 66 64 65  ero==0 );..#ifde
5450: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5460: 53 54 41 54 34 0a 20 20 2f 2a 20 53 74 61 74 34  STAT4.  /* Stat4
5470: 41 63 63 75 6d 2e 6e 4d 61 78 45 71 5a 65 72 6f  Accum.nMaxEqZero
5480: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
5490: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
54a0: 20 6c 65 61 64 69 6e 67 20 30 0a 20 20 2a 2a 20   leading 0.  ** 
54b0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 6e  values in the an
54c0: 45 71 5b 5d 20 61 72 72 61 79 20 6f 66 20 61 6e  Eq[] array of an
54d0: 79 20 73 61 6d 70 6c 65 20 69 6e 20 53 74 61 74  y sample in Stat
54e0: 34 41 63 63 75 6d 2e 61 5b 5d 2e 20 49 6e 0a 20  4Accum.a[]. In. 
54f0: 20 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   ** other words,
5500: 20 69 66 20 6e 4d 61 78 45 71 5a 65 72 6f 20 69   if nMaxEqZero i
5510: 73 20 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  s n, then it is 
5520: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
5530: 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
5540: 6f 20 73 61 6d 70 6c 65 73 20 77 69 74 68 20 53  o samples with S
5550: 74 61 74 34 53 61 6d 70 6c 65 2e 61 6e 45 71 5b  tat4Sample.anEq[
5560: 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d 3e 3d 6e 29  m]==0 for (m>=n)
5570: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 5a 65  . */.  if( nEqZe
5580: 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f  ro>p->nMaxEqZero
5590: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45   ){.    p->nMaxE
55a0: 71 5a 65 72 6f 20 3d 20 6e 45 71 5a 65 72 6f 3b  qZero = nEqZero;
55b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d  .  }.  if( pNew-
55c0: 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 7b  >isPSample==0 ){
55d0: 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65  .    Stat4Sample
55e0: 20 2a 70 55 70 67 72 61 64 65 20 3d 20 30 3b 0a   *pUpgrade = 0;.
55f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
5600: 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f  ->anEq[pNew->iCo
5610: 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  l]>0 );..    /* 
5620: 54 68 69 73 20 73 61 6d 70 6c 65 20 69 73 20 62  This sample is b
5630: 65 69 6e 67 20 61 64 64 65 64 20 62 65 63 61 75  eing added becau
5640: 73 65 20 74 68 65 20 70 72 65 66 69 78 20 74 68  se the prefix th
5650: 61 74 20 65 6e 64 73 20 69 6e 20 63 6f 6c 75 6d  at ends in colum
5660: 6e 20 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 20 6f  n .    ** iCol o
5670: 63 63 75 72 73 20 6d 61 6e 79 20 74 69 6d 65 73  ccurs many times
5680: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 48   in the table. H
5690: 6f 77 65 76 65 72 2c 20 69 66 20 77 65 20 68 61  owever, if we ha
56a0: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ve already.    *
56b0: 2a 20 61 64 64 65 64 20 61 20 73 61 6d 70 6c 65  * added a sample
56c0: 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68 69   that shares thi
56d0: 73 20 70 72 65 66 69 78 2c 20 74 68 65 72 65 20  s prefix, there 
56e0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 64  is no need to ad
56f0: 64 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 6e  d.    ** this on
5700: 65 2e 20 49 6e 73 74 65 61 64 2c 20 75 70 67 72  e. Instead, upgr
5710: 61 64 65 20 74 68 65 20 70 72 69 6f 72 69 74 79  ade the priority
5720: 20 6f 66 20 74 68 65 20 68 69 67 68 65 73 74 20   of the highest 
5730: 70 72 69 6f 72 69 74 79 0a 20 20 20 20 2a 2a 20  priority.    ** 
5740: 65 78 69 73 74 69 6e 67 20 73 61 6d 70 6c 65 20  existing sample 
5750: 74 68 61 74 20 73 68 61 72 65 73 20 74 68 69 73  that shares this
5760: 20 70 72 65 66 69 78 2e 20 20 2a 2f 0a 20 20 20   prefix.  */.   
5770: 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c   for(i=p->nSampl
5780: 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  e-1; i>=0; i--){
5790: 0a 20 20 20 20 20 20 53 74 61 74 34 53 61 6d 70  .      Stat4Samp
57a0: 6c 65 20 2a 70 4f 6c 64 20 3d 20 26 70 2d 3e 61  le *pOld = &p->a
57b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
57c0: 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e  Old->anEq[pNew->
57d0: 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol]==0 ){.    
57e0: 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 69 73      if( pOld->is
57f0: 50 53 61 6d 70 6c 65 20 29 20 72 65 74 75 72 6e  PSample ) return
5800: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5810: 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3e 70 4e 65  ( pOld->iCol>pNe
5820: 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 20 20 20  w->iCol );.     
5830: 20 20 20 61 73 73 65 72 74 28 20 73 61 6d 70 6c     assert( sampl
5840: 65 49 73 42 65 74 74 65 72 28 70 2c 20 70 4e 65  eIsBetter(p, pNe
5850: 77 2c 20 70 4f 6c 64 29 20 29 3b 0a 20 20 20 20  w, pOld) );.    
5860: 20 20 20 20 69 66 28 20 70 55 70 67 72 61 64 65      if( pUpgrade
5870: 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42  ==0 || sampleIsB
5880: 65 74 74 65 72 28 70 2c 20 70 4f 6c 64 2c 20 70  etter(p, pOld, p
5890: 55 70 67 72 61 64 65 29 20 29 7b 0a 20 20 20 20  Upgrade) ){.    
58a0: 20 20 20 20 20 20 70 55 70 67 72 61 64 65 20 3d        pUpgrade =
58b0: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 7d   pOld;.        }
58c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
58d0: 20 20 20 69 66 28 20 70 55 70 67 72 61 64 65 20     if( pUpgrade 
58e0: 29 7b 0a 20 20 20 20 20 20 70 55 70 67 72 61 64  ){.      pUpgrad
58f0: 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e  e->iCol = pNew->
5900: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 55 70 67  iCol;.      pUpg
5910: 72 61 64 65 2d 3e 61 6e 45 71 5b 70 55 70 67 72  rade->anEq[pUpgr
5920: 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d 20 70 4e 65  ade->iCol] = pNe
5930: 77 2d 3e 61 6e 45 71 5b 70 55 70 67 72 61 64 65  w->anEq[pUpgrade
5940: 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 67  ->iCol];.      g
5950: 6f 74 6f 20 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e  oto find_new_min
5960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
5970: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6e 65 63 65  if..  /* If nece
5980: 73 73 61 72 79 2c 20 72 65 6d 6f 76 65 20 73 61  ssary, remove sa
5990: 6d 70 6c 65 20 69 4d 69 6e 20 74 6f 20 6d 61 6b  mple iMin to mak
59a0: 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
59b0: 65 77 20 73 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20  ew sample. */.  
59c0: 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 3d  if( p->nSample>=
59d0: 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b 0a 20  p->mxSample ){. 
59e0: 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a     Stat4Sample *
59f0: 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  pMin = &p->a[p->
5a00: 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52 6f 77 63  iMin];.    tRowc
5a10: 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d 69 6e 2d  nt *anEq = pMin-
5a20: 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52 6f 77 63  >anEq;.    tRowc
5a30: 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d 69 6e 2d  nt *anLt = pMin-
5a40: 3e 61 6e 4c 74 3b 0a 20 20 20 20 74 52 6f 77 63  >anLt;.    tRowc
5a50: 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70 4d 69 6e  nt *anDLt = pMin
5a60: 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20 73 61 6d  ->anDLt;.    sam
5a70: 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64 62 2c 20  pleClear(p->db, 
5a80: 70 4d 69 6e 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f  pMin);.    memmo
5a90: 76 65 28 70 4d 69 6e 2c 20 26 70 4d 69 6e 5b 31  ve(pMin, &pMin[1
5aa0: 5d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  ], sizeof(p->a[0
5ab0: 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70 6c 65 2d 70  ])*(p->nSample-p
5ac0: 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a 20 20 20 20  ->iMin-1));.    
5ad0: 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b  pSample = &p->a[
5ae0: 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20  p->nSample-1];. 
5af0: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 52 6f 77     pSample->nRow
5b00: 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 53 61 6d  id = 0;.    pSam
5b10: 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61 6e 45 71  ple->anEq = anEq
5b20: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61  ;.    pSample->a
5b30: 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b 0a 20 20  nDLt = anDLt;.  
5b40: 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 20    pSample->anLt 
5b50: 3d 20 61 6e 4c 74 3b 0a 20 20 20 20 70 2d 3e 6e  = anLt;.    p->n
5b60: 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6d 78 53 61  Sample = p->mxSa
5b70: 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  mple-1;.  }..  /
5b80: 2a 20 54 68 65 20 22 72 6f 77 73 20 6c 65 73 73  * The "rows less
5b90: 2d 74 68 61 6e 22 20 66 6f 72 20 74 68 65 20 72  -than" for the r
5ba0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6d 75 73 74  owid column must
5bb0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
5bc0: 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f 72 20 74   that.  ** for t
5bd0: 68 65 20 6c 61 73 74 20 73 61 6d 70 6c 65 20 69  he last sample i
5be0: 6e 20 74 68 65 20 70 2d 3e 61 5b 5d 20 61 72 72  n the p->a[] arr
5bf0: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ay. Otherwise, t
5c00: 68 65 20 73 61 6d 70 6c 65 73 20 77 6f 75 6c 64  he samples would
5c10: 0a 20 20 2a 2a 20 62 65 20 6f 75 74 20 6f 66 20  .  ** be out of 
5c20: 6f 72 64 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66  order. */.#ifdef
5c30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5c40: 54 41 54 34 0a 20 20 61 73 73 65 72 74 28 20 70  TAT4.  assert( p
5c50: 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 0a 20 20  ->nSample==0 .  
5c60: 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 6e       || pNew->an
5c70: 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 20 3e 20  Lt[p->nCol-1] > 
5c80: 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d  p->a[p->nSample-
5c90: 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d  1].anLt[p->nCol-
5ca0: 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  1] );.#endif..  
5cb0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
5cc0: 77 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 70 53  w sample */.  pS
5cd0: 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b 70 2d  ample = &p->a[p-
5ce0: 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 73 61 6d  >nSample];.  sam
5cf0: 70 6c 65 43 6f 70 79 28 70 2c 20 70 53 61 6d 70  pleCopy(p, pSamp
5d00: 6c 65 2c 20 70 4e 65 77 29 3b 0a 20 20 70 2d 3e  le, pNew);.  p->
5d10: 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a 20 20 2f 2a  nSample++;..  /*
5d20: 20 5a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   Zero the first 
5d30: 6e 45 71 5a 65 72 6f 20 65 6e 74 72 69 65 73 20  nEqZero entries 
5d40: 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72  in the anEq[] ar
5d50: 72 61 79 2e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ray. */.  memset
5d60: 28 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c 20  (pSample->anEq, 
5d70: 30 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  0, sizeof(tRowcn
5d80: 74 29 2a 6e 45 71 5a 65 72 6f 29 3b 0a 0a 23 69  t)*nEqZero);..#i
5d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5da0: 4c 45 5f 53 54 41 54 34 0a 20 66 69 6e 64 5f 6e  LE_STAT4. find_n
5db0: 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64 69 66 0a 20  ew_min:.#endif. 
5dc0: 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e   if( p->nSample>
5dd0: 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b 0a  =p->mxSample ){.
5de0: 20 20 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 2d      int iMin = -
5df0: 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
5e00: 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20 69  i<p->mxSample; i
5e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
5e20: 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d 70 6c 65  ->a[i].isPSample
5e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5e40: 20 20 20 69 66 28 20 69 4d 69 6e 3c 30 20 7c 7c     if( iMin<0 ||
5e50: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5e60: 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e 5d 2c 20  p, &p->a[iMin], 
5e70: 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a 20 20 20  &p->a[i]) ){.   
5e80: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b 0a 20       iMin = i;. 
5e90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5ea0: 20 61 73 73 65 72 74 28 20 69 4d 69 6e 3e 3d 30   assert( iMin>=0
5eb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d 69 6e 20   );.    p->iMin 
5ec0: 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a 23 65  = iMin;.  }.}.#e
5ed0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
5ee0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
5ef0: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  TAT4 */../*.** F
5f00: 69 65 6c 64 20 69 43 68 6e 67 20 6f 66 20 74 68  ield iChng of th
5f10: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63  e index being sc
5f20: 61 6e 6e 65 64 20 68 61 73 20 63 68 61 6e 67 65  anned has change
5f30: 64 2e 20 53 6f 20 61 74 20 74 68 69 73 20 70 6f  d. So at this po
5f40: 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72 72 65 6e  int.** p->curren
5f50: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 61 6d  t contains a sam
5f60: 70 6c 65 20 74 68 61 74 20 72 65 66 6c 65 63 74  ple that reflect
5f70: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  s the previous r
5f80: 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 64  ow of the.** ind
5f90: 65 78 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  ex. The value of
5fa0: 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20 61 6e 64   anEq[iChng] and
5fb0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 6e 45 71   subsequent anEq
5fc0: 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a  [] elements are.
5fd0: 2a 2a 20 63 6f 72 72 65 63 74 20 61 74 20 74 68  ** correct at th
5fe0: 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  is point..*/.sta
5ff0: 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 50  tic void sampleP
6000: 75 73 68 50 72 65 76 69 6f 75 73 28 53 74 61 74  ushPrevious(Stat
6010: 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e 74 20 69  4Accum *p, int i
6020: 43 68 6e 67 29 7b 0a 23 69 66 64 65 66 20 53 51  Chng){.#ifdef SQ
6030: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
6040: 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  4.  int i;..  /*
6050: 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20 73 61   Check if any sa
6060: 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 61  mples from the a
6070: 42 65 73 74 5b 5d 20 61 72 72 61 79 20 73 68 6f  Best[] array sho
6080: 75 6c 64 20 62 65 20 70 75 73 68 65 64 0a 20 20  uld be pushed.  
6090: 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78 53 61 6d  ** into IndexSam
60a0: 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68 69 73 20  ple.a[] at this 
60b0: 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72  point.  */.  for
60c0: 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32 29 3b 20  (i=(p->nCol-2); 
60d0: 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d 29 7b 0a  i>=iChng; i--){.
60e0: 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20      Stat4Sample 
60f0: 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e 61 42 65  *pBest = &p->aBe
6100: 73 74 5b 69 5d 3b 0a 20 20 20 20 70 42 65 73 74  st[i];.    pBest
6110: 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 70 2d 3e 63  ->anEq[i] = p->c
6120: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a  urrent.anEq[i];.
6130: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70      if( p->nSamp
6140: 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 7c  le<p->mxSample |
6150: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
6160: 28 70 2c 20 70 42 65 73 74 2c 20 26 70 2d 3e 61  (p, pBest, &p->a
6170: 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29 7b 0a 20 20  [p->iMin]) ){.  
6180: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6190: 28 70 2c 20 70 42 65 73 74 2c 20 69 29 3b 0a 20  (p, pBest, i);. 
61a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
61b0: 68 65 63 6b 20 74 68 61 74 20 6e 6f 20 73 61 6d  heck that no sam
61c0: 70 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ple contains an 
61d0: 61 6e 45 71 5b 5d 20 65 6e 74 72 79 20 77 69 74  anEq[] entry wit
61e0: 68 20 61 6e 20 69 6e 64 65 78 20 6f 66 0a 20 20  h an index of.  
61f0: 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f  ** p->nMaxEqZero
6200: 20 6f 72 20 67 72 65 61 74 65 72 20 73 65 74 20   or greater set 
6210: 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 66 6f  to zero. */.  fo
6220: 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  r(i=p->nSample-1
6230: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
6240: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
6250: 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f  (j=p->nMaxEqZero
6260: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
6270: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 69  ) assert( p->a[i
6280: 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20 29 3b 0a 20  ].anEq[j]>0 );. 
6290: 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
62a0: 74 68 65 20 61 6e 45 71 5b 5d 20 66 69 65 6c 64  the anEq[] field
62b0: 73 20 6f 66 20 61 6e 79 20 73 61 6d 70 6c 65 73  s of any samples
62c0: 20 61 6c 72 65 61 64 79 20 63 6f 6c 6c 65 63 74   already collect
62d0: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 69 43 68  ed. */.  if( iCh
62e0: 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f  ng<p->nMaxEqZero
62f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   ){.    for(i=p-
6300: 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30  >nSample-1; i>=0
6310: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e  ; i--){.      in
6320: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
6330: 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d 3e 6e 43 6f  =iChng; j<p->nCo
6340: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
6350: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45   if( p->a[i].anE
6360: 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d 3e 61 5b 69  q[j]==0 ) p->a[i
6370: 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20 70 2d 3e 63  ].anEq[j] = p->c
6380: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6a 5d 3b 0a  urrent.anEq[j];.
6390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
63a0: 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f 20    p->nMaxEqZero 
63b0: 3d 20 69 43 68 6e 67 3b 0a 20 20 7d 0a 23 65 6e  = iChng;.  }.#en
63c0: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
63d0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
63e0: 54 41 54 33 29 20 26 26 20 21 64 65 66 69 6e 65  TAT3) && !define
63f0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6400: 53 54 41 54 34 29 0a 20 20 69 66 28 20 69 43 68  STAT4).  if( iCh
6410: 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 74 52 6f  ng==0 ){.    tRo
6420: 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75  wcnt nLt = p->cu
6430: 72 72 65 6e 74 2e 61 6e 4c 74 5b 30 5d 3b 0a 20  rrent.anLt[0];. 
6440: 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 20 3d     tRowcnt nEq =
6450: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
6460: 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  [0];..    /* Che
6470: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 6f  ck if this is to
6480: 20 62 65 20 61 20 70 65 72 69 6f 64 69 63 20 73   be a periodic s
6490: 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64  ample. If so, ad
64a0: 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d it. */.    if(
64b0: 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c   (nLt/p->nPSampl
64c0: 65 29 21 3d 28 6e 4c 74 2b 6e 45 71 29 2f 70 2d  e)!=(nLt+nEq)/p-
64d0: 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >nPSample ){.   
64e0: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
64f0: 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20  PSample = 1;.   
6500: 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28     sampleInsert(
6510: 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  p, &p->current, 
6520: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  0);.      p->cur
6530: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
6540: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a   0;.    }else ..
6550: 20 20 20 20 2f 2a 20 4f 72 20 69 66 20 69 74 20      /* Or if it 
6560: 69 73 20 61 20 6e 6f 6e 2d 70 65 72 69 6f 64 69  is a non-periodi
6570: 63 20 73 61 6d 70 6c 65 2e 20 41 64 64 20 69 74  c sample. Add it
6580: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 6f   in this case to
6590: 6f 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  o. */.    if( p-
65a0: 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61  >nSample<p->mxSa
65b0: 6d 70 6c 65 20 0a 20 20 20 20 20 7c 7c 20 73 61  mple .     || sa
65c0: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
65d0: 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70 2d  &p->current, &p-
65e0: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 0a 20 20  >a[p->iMin]) .  
65f0: 20 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c    ){.      sampl
6600: 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63  eInsert(p, &p->c
6610: 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  urrent, 0);.    
6620: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
6630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
6640: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
6650: 54 34 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  T4.  UNUSED_PARA
6660: 4d 45 54 45 52 28 20 70 20 29 3b 0a 20 20 55 4e  METER( p );.  UN
6670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
6680: 69 43 68 6e 67 20 29 3b 0a 23 65 6e 64 69 66 0a  iChng );.#endif.
6690: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
66a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
66b0: 74 61 74 5f 70 75 73 68 20 53 51 4c 20 66 75 6e  tat_push SQL fun
66c0: 63 74 69 6f 6e 3a 20 20 73 74 61 74 5f 70 75 73  ction:  stat_pus
66d0: 68 28 50 2c 43 2c 52 29 0a 2a 2a 20 41 72 67 75  h(P,C,R).** Argu
66e0: 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ments:.**.**    
66f0: 50 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f  P     Pointer to
6700: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20   the Stat4Accum 
6710: 6f 62 6a 65 63 74 20 63 72 65 61 74 65 64 20 62  object created b
6720: 79 20 73 74 61 74 5f 69 6e 69 74 28 29 0a 2a 2a  y stat_init().**
6730: 20 20 20 20 43 20 20 20 20 20 49 6e 64 65 78 20      C     Index 
6740: 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
6750: 75 6d 6e 20 74 6f 20 64 69 66 66 65 72 20 66 72  umn to differ fr
6760: 6f 6d 20 70 72 65 76 69 6f 75 73 20 72 6f 77 0a  om previous row.
6770: 2a 2a 20 20 20 20 52 20 20 20 20 20 52 6f 77 69  **    R     Rowi
6780: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
6790: 74 20 72 6f 77 2e 20 20 4d 69 67 68 74 20 62 65  t row.  Might be
67a0: 20 61 20 6b 65 79 20 72 65 63 6f 72 64 20 66 6f   a key record fo
67b0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 57 49  r.**          WI
67c0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
67d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 53  es..**.** This S
67e0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  QL function alwa
67f0: 79 73 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ys returns NULL.
6800: 20 20 49 74 27 73 20 70 75 72 70 6f 73 65 20 69    It's purpose i
6810: 74 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 0a  t to accumulate.
6820: 2a 2a 20 73 74 61 74 69 73 74 69 63 61 6c 20 64  ** statistical d
6830: 61 74 61 20 61 6e 64 2f 6f 72 20 73 61 6d 70 6c  ata and/or sampl
6840: 65 73 20 69 6e 20 74 68 65 20 53 74 61 74 34 41  es in the Stat4A
6850: 63 63 75 6d 20 6f 62 6a 65 63 74 20 61 62 6f 75  ccum object abou
6860: 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 62  t the.** index b
6870: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e 20 20  eing analyzed.  
6880: 54 68 65 20 73 74 61 74 5f 67 65 74 28 29 20 53  The stat_get() S
6890: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  QL function will
68a0: 20 6c 61 74 65 72 20 62 65 20 75 73 65 64 20 74   later be used t
68b0: 6f 0a 2a 2a 20 65 78 74 72 61 63 74 20 72 65 6c  o.** extract rel
68c0: 65 76 61 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f  evant informatio
68d0: 6e 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69  n for constructi
68e0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  ng the sqlite_st
68f0: 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  atN tables..**.*
6900: 2a 20 54 68 65 20 52 20 70 61 72 61 6d 65 74 65  * The R paramete
6910: 72 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  r is only used f
6920: 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  or STAT3 and STA
6930: 54 34 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  T4.*/.static voi
6940: 64 20 73 74 61 74 50 75 73 68 28 0a 20 20 73 71  d statPush(.  sq
6950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6960: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6970: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6980: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6990: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68 65  int i;..  /* The
69a0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 20   three function 
69b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
69c0: 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28  tat4Accum *p = (
69d0: 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c 69  Stat4Accum*)sqli
69e0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
69f0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 69  rgv[0]);.  int i
6a00: 43 68 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  Chng = sqlite3_v
6a10: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
6a20: 29 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  );..  UNUSED_PAR
6a30: 41 4d 45 54 45 52 28 20 61 72 67 63 20 29 3b 0a  AMETER( argc );.
6a40: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6a50: 45 52 28 20 63 6f 6e 74 65 78 74 20 29 3b 0a 20  ER( context );. 
6a60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 43 6f 6c   assert( p->nCol
6a70: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6a80: 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f 6c 20 29 3b  iChng<p->nCol );
6a90: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 3d  ..  if( p->nRow=
6aa0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
6ab0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 63  s is the first c
6ac0: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
6ad0: 74 69 6f 6e 2e 20 44 6f 20 69 6e 69 74 69 61 6c  tion. Do initial
6ae0: 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ization. */.    
6af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
6b00: 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e 63 75 72 72  ol; i++) p->curr
6b10: 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20 31 3b  ent.anEq[i] = 1;
6b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6b30: 20 53 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   Second and subs
6b40: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 67 65 74  equent calls get
6b50: 20 70 72 6f 63 65 73 73 65 64 20 68 65 72 65 20   processed here 
6b60: 2a 2f 0a 20 20 20 20 73 61 6d 70 6c 65 50 75 73  */.    samplePus
6b70: 68 50 72 65 76 69 6f 75 73 28 70 2c 20 69 43 68  hPrevious(p, iCh
6b80: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  ng);..    /* Upd
6b90: 61 74 65 20 61 6e 44 4c 74 5b 5d 2c 20 61 6e 4c  ate anDLt[], anL
6ba0: 74 5b 5d 20 61 6e 64 20 61 6e 45 71 5b 5d 20 74  t[] and anEq[] t
6bb0: 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 76 61  o reflect the va
6bc0: 6c 75 65 73 20 74 68 61 74 20 61 70 70 6c 79 0a  lues that apply.
6bd0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 75      ** to the cu
6be0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
6bf0: 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 66   index. */.    f
6c00: 6f 72 28 69 3d 30 3b 20 69 3c 69 43 68 6e 67 3b  or(i=0; i<iChng;
6c10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
6c20: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 2b  current.anEq[i]+
6c30: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
6c40: 28 69 3d 69 43 68 6e 67 3b 20 69 3c 70 2d 3e 6e  (i=iChng; i<p->n
6c50: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6c60: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c   p->current.anDL
6c70: 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53  t[i]++;.#ifdef S
6c80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
6c90: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
6ca0: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c    p->current.anL
6cb0: 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63 75 72 72 65  t[i] += p->curre
6cc0: 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a 23 65 6e 64  nt.anEq[i];.#end
6cd0: 69 66 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  if.      p->curr
6ce0: 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20 31 3b  ent.anEq[i] = 1;
6cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
6d00: 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64 65 66 20 53  nRow++;.#ifdef S
6d10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
6d20: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66  T3_OR_STAT4.  if
6d30: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
6d40: 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53  type(argv[2])==S
6d50: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
6d60: 0a 20 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f  .    sampleSetRo
6d70: 77 69 64 49 6e 74 36 34 28 70 2d 3e 64 62 2c 20  widInt64(p->db, 
6d80: 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73 71 6c  &p->current, sql
6d90: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
6da0: 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20 7d 65  (argv[2]));.  }e
6db0: 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  lse{.    sampleS
6dc0: 65 74 52 6f 77 69 64 28 70 2d 3e 64 62 2c 20 26  etRowid(p->db, &
6dd0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73 71 6c 69  p->current, sqli
6de0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6df0: 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20 20 20 20  argv[2]),.      
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6e30: 6c 6f 62 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20  lob(argv[2]));. 
6e40: 20 7d 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e   }.  p->current.
6e50: 69 48 61 73 68 20 3d 20 70 2d 3e 69 50 72 6e 20  iHash = p->iPrn 
6e60: 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30 33 35 31  = p->iPrn*110351
6e70: 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a 23 65  5245 + 12345;.#e
6e80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
6e90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
6ea0: 0a 20 20 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74  .  {.    tRowcnt
6eb0: 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e   nLt = p->curren
6ec0: 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31  t.anLt[p->nCol-1
6ed0: 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ];..    /* Check
6ee0: 20 69 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   if this is to b
6ef0: 65 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d  e a periodic sam
6f00: 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20  ple. If so, add 
6f10: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  it. */.    if( (
6f20: 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 29  nLt/p->nPSample)
6f30: 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d 3e 6e 50 53  !=(nLt+1)/p->nPS
6f40: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  ample ){.      p
6f50: 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d  ->current.isPSam
6f60: 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ple = 1;.      p
6f70: 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20 3d  ->current.iCol =
6f80: 20 30 3b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65   0;.      sample
6f90: 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63 75  Insert(p, &p->cu
6fa0: 72 72 65 6e 74 2c 20 70 2d 3e 6e 43 6f 6c 2d 31  rrent, p->nCol-1
6fb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  );.      p->curr
6fc0: 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20  ent.isPSample = 
6fd0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
6fe0: 20 55 70 64 61 74 65 20 74 68 65 20 61 42 65 73   Update the aBes
6ff0: 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  t[] array. */.  
7000: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70 2d    for(i=0; i<(p-
7010: 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29 7b 0a  >nCol-1); i++){.
7020: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
7030: 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20 20  .iCol = i;.     
7040: 20 69 66 28 20 69 3e 3d 69 43 68 6e 67 20 7c 7c   if( i>=iChng ||
7050: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 50   sampleIsBetterP
7060: 6f 73 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ost(p, &p->curre
7070: 6e 74 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d  nt, &p->aBest[i]
7080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 61 6d  ) ){.        sam
7090: 70 6c 65 43 6f 70 79 28 70 2c 20 26 70 2d 3e 61  pleCopy(p, &p->a
70a0: 42 65 73 74 5b 69 5d 2c 20 26 70 2d 3e 63 75 72  Best[i], &p->cur
70b0: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rent);.      }. 
70c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
70d0: 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46  }.static const F
70e0: 75 6e 63 44 65 66 20 73 74 61 74 50 75 73 68 46  uncDef statPushF
70f0: 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b 49  uncdef = {.  2+I
7100: 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a  sStat34,      /*
7110: 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54   nArg */.  SQLIT
7120: 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66  E_UTF8,     /* f
7130: 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c  uncFlags */.  0,
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7150: 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20  * pUserData */. 
7160: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7170: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
7180: 73 74 61 74 50 75 73 68 2c 20 20 20 20 20 20 20  statPush,       
7190: 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20   /* xSFunc */.  
71a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
71b0: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
71c0: 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  .  0, 0,        
71d0: 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20 78      /* xValue, x
71e0: 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73 74  Inverse */.  "st
71f0: 61 74 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a  at_push",     /*
7200: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
7210: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 54 41 54  };..#define STAT
7220: 5f 47 45 54 5f 53 54 41 54 31 20 30 20 20 20 20  _GET_STAT1 0    
7230: 20 20 20 20 20 20 2f 2a 20 22 73 74 61 74 22 20        /* "stat" 
7240: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 31 20  column of stat1 
7250: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
7260: 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20   STAT_GET_ROWID 
7270: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 72  1          /* "r
7280: 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  owid" column of 
7290: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
72a0: 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47  /.#define STAT_G
72b0: 45 54 5f 4e 45 51 20 20 20 32 20 20 20 20 20 20  ET_NEQ   2      
72c0: 20 20 20 20 2f 2a 20 22 6e 65 71 22 20 63 6f 6c      /* "neq" col
72d0: 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20  umn of stat[34] 
72e0: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
72f0: 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 20 20 20   STAT_GET_NLT   
7300: 33 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 6e  3          /* "n
7310: 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  lt" column of st
7320: 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a  at[34] entry */.
7330: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
7340: 5f 4e 44 4c 54 20 20 34 20 20 20 20 20 20 20 20  _NDLT  4        
7350: 20 20 2f 2a 20 22 6e 64 6c 74 22 20 63 6f 6c 75    /* "ndlt" colu
7360: 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65  mn of stat[34] e
7370: 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ntry */../*.** I
7380: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7390: 20 74 68 65 20 73 74 61 74 5f 67 65 74 28 50 2c   the stat_get(P,
73a0: 4a 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  J) SQL function.
73b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
73c0: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 71 75 65  s.** used to que
73d0: 72 79 20 73 74 61 74 69 73 74 69 63 61 6c 20 69  ry statistical i
73e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
73f0: 68 61 73 20 62 65 65 6e 20 67 61 74 68 65 72 65  has been gathere
7400: 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 74  d into.** the St
7410: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
7420: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
7430: 6f 20 73 74 61 74 5f 70 75 73 68 28 29 2e 20 20  o stat_push().  
7440: 54 68 65 20 50 20 70 61 72 61 6d 65 74 65 72 0a  The P parameter.
7450: 2a 2a 20 68 61 73 20 74 79 70 65 20 42 4c 4f 42  ** has type BLOB
7460: 20 62 75 74 20 69 74 20 69 73 20 72 65 61 6c 6c   but it is reall
7470: 79 20 6a 75 73 74 20 61 20 70 6f 69 6e 74 65 72  y just a pointer
7480: 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63   to the Stat4Acc
7490: 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68  um object..** Th
74a0: 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 72 65 74  e content to ret
74b0: 75 72 6e 65 64 20 69 73 20 64 65 74 65 72 6d 69  urned is determi
74c0: 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ned by the param
74d0: 65 74 65 72 20 4a 0a 2a 2a 20 77 68 69 63 68 20  eter J.** which 
74e0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 54  is one of the ST
74f0: 41 54 5f 47 45 54 5f 78 78 78 78 20 76 61 6c 75  AT_GET_xxxx valu
7500: 65 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  es defined above
7510: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74  ..**.** The stat
7520: 5f 67 65 74 28 50 2c 4a 29 20 66 75 6e 63 74 69  _get(P,J) functi
7530: 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  on is not availa
7540: 62 6c 65 20 74 6f 20 67 65 6e 65 72 69 63 20 53  ble to generic S
7550: 51 4c 2e 20 20 49 74 20 69 73 0a 2a 2a 20 69 6e  QL.  It is.** in
7560: 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f  serted as part o
7570: 66 20 61 20 6d 61 6e 75 61 6c 6c 79 20 63 6f 6e  f a manually con
7580: 73 74 72 75 63 74 65 64 20 62 79 74 65 63 6f 64  structed bytecod
7590: 65 20 70 72 6f 67 72 61 6d 2e 20 20 28 53 65 65  e program.  (See
75a0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 53 74 61 74  .** the callStat
75b0: 47 65 74 28 29 20 72 6f 75 74 69 6e 65 20 62 65  Get() routine be
75c0: 6c 6f 77 2e 29 20 20 49 74 20 69 73 20 67 75 61  low.)  It is gua
75d0: 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
75e0: 20 50 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20   P.** parameter 
75f0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
7600: 20 70 6f 69 6e 65 72 20 74 6f 20 61 20 53 74 61   poiner to a Sta
7610: 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2c 20  t4Accum object, 
7620: 6e 65 76 65 72 20 61 0a 2a 2a 20 4e 55 4c 4c 2e  never a.** NULL.
7630: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
7640: 72 20 53 54 41 54 33 20 6e 6f 72 20 53 54 41 54  r STAT3 nor STAT
7650: 34 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74  4 are enabled, t
7660: 68 65 6e 20 4a 20 69 73 20 61 6c 77 61 79 73 0a  hen J is always.
7670: 2a 2a 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  ** STAT_GET_STAT
7680: 31 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 6f  1 and is hence o
7690: 6d 69 74 74 65 64 20 61 6e 64 20 74 68 69 73 20  mitted and this 
76a0: 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a  routine becomes.
76b0: 2a 2a 20 61 20 6f 6e 65 2d 70 61 72 61 6d 65 74  ** a one-paramet
76c0: 65 72 20 66 75 6e 63 74 69 6f 6e 2c 20 73 74 61  er function, sta
76d0: 74 5f 67 65 74 28 50 29 2c 20 74 68 61 74 20 61  t_get(P), that a
76e0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 74 68  lways returns th
76f0: 65 0a 2a 2a 20 73 74 61 74 31 20 74 61 62 6c 65  e.** stat1 table
7700: 20 65 6e 74 72 79 20 69 6e 66 6f 72 6d 61 74 69   entry informati
7710: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
7720: 69 64 20 73 74 61 74 47 65 74 28 0a 20 20 73 71  id statGet(.  sq
7730: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7740: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7750: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7760: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7770: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20  Stat4Accum *p = 
7780: 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c  (Stat4Accum*)sql
7790: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
77a0: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 64 65 66  argv[0]);.#ifdef
77b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
77c0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
77d0: 2f 2a 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  /* STAT3 and STA
77e0: 54 34 20 68 61 76 65 20 61 20 70 61 72 61 6d 65  T4 have a parame
77f0: 74 65 72 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ter on this rout
7800: 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 43  ine. */.  int eC
7810: 61 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  all = sqlite3_va
7820: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
7830: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
7840: 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
7850: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7860: 5f 53 54 41 54 31 20 7c 7c 20 65 43 61 6c 6c 3d  _STAT1 || eCall=
7870: 3d 53 54 41 54 5f 47 45 54 5f 4e 45 51 20 0a 20  =STAT_GET_NEQ . 
7880: 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d        || eCall==
7890: 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20 7c  STAT_GET_ROWID |
78a0: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
78b0: 54 5f 4e 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20  T_NLT.       || 
78c0: 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f  eCall==STAT_GET_
78d0: 4e 44 4c 54 20 0a 20 20 29 3b 0a 20 20 69 66 28  NDLT .  );.  if(
78e0: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
78f0: 5f 53 54 41 54 31 20 29 0a 23 65 6c 73 65 0a 20  _STAT1 ).#else. 
7900: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
7910: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20   );.#endif.  {. 
7920: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7930: 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20   value to store 
7940: 69 6e 20 74 68 65 20 22 73 74 61 74 22 20 63 6f  in the "stat" co
7950: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  lumn of the sqli
7960: 74 65 5f 73 74 61 74 31 0a 20 20 20 20 2a 2a 20  te_stat1.    ** 
7970: 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20 69  table for this i
7980: 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
7990: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
79a0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73   a string compos
79b0: 65 64 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20  ed of a list of 
79c0: 69 6e 74 65 67 65 72 73 20 64 65 73 63 72 69 62  integers describ
79d0: 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ing .    ** the 
79e0: 69 6e 64 65 78 2e 20 54 68 65 20 66 69 72 73 74  index. The first
79f0: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
7a00: 6c 69 73 74 20 69 73 20 74 68 65 20 74 6f 74 61  list is the tota
7a10: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  l number of .   
7a20: 20 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74   ** entries in t
7a30: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 72 65 20  he index. There 
7a40: 69 73 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  is one additiona
7a50: 6c 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  l integer in the
7a60: 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a 20 66 6f   list .    ** fo
7a70: 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 63  r each indexed c
7a80: 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 61 64 64 69  olumn. This addi
7a90: 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69  tional integer i
7aa0: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
7ab0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
7ac0: 65 72 20 6f 66 20 72 6f 77 73 20 6d 61 74 63 68  er of rows match
7ad0: 65 64 20 62 79 20 61 20 73 74 61 62 62 69 6e 67  ed by a stabbing
7ae0: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 20 69 6e   query on the in
7af0: 64 65 78 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  dex using.    **
7b00: 20 61 20 6b 65 79 20 77 69 74 68 20 74 68 65 20   a key with the 
7b10: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 75  corresponding nu
7b20: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
7b30: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
7b40: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 69 6e      ** if the in
7b50: 64 65 78 20 69 73 20 6f 6e 20 63 6f 6c 75 6d 6e  dex is on column
7b60: 73 20 28 61 2c 62 29 20 61 6e 64 20 74 68 65 20  s (a,b) and the 
7b70: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 76 61 6c  sqlite_stat1 val
7b80: 75 65 20 69 73 20 0a 20 20 20 20 2a 2a 20 22 31  ue is .    ** "1
7b90: 30 30 20 31 30 20 32 22 2c 20 74 68 65 6e 20 53  00 10 2", then S
7ba0: 51 4c 69 74 65 20 65 73 74 69 6d 61 74 65 73 20  QLite estimates 
7bb0: 74 68 61 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  that:.    **.   
7bc0: 20 2a 2a 20 20 20 2a 20 74 68 65 20 69 6e 64 65   **   * the inde
7bd0: 78 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 72  x contains 100 r
7be0: 6f 77 73 2c 0a 20 20 20 20 2a 2a 20 20 20 2a 20  ows,.    **   * 
7bf0: 22 57 48 45 52 45 20 61 3d 3f 22 20 6d 61 74 63  "WHERE a=?" matc
7c00: 68 65 73 20 31 30 20 72 6f 77 73 2c 20 61 6e 64  hes 10 rows, and
7c10: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48 45  .    **   * "WHE
7c20: 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 22 20  RE a=? AND b=?" 
7c30: 6d 61 74 63 68 65 73 20 32 20 72 6f 77 73 2e 0a  matches 2 rows..
7c40: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
7c50: 20 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20   D is the count 
7c60: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
7c70: 65 73 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20  es and K is the 
7c80: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c90: 0a 20 20 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  .    ** rows, th
7ca0: 65 6e 20 65 61 63 68 20 65 73 74 69 6d 61 74 65  en each estimate
7cb0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 73 3a   is computed as:
7cc0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
7cd0: 20 20 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31        I = (K+D-1
7ce0: 29 2f 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )/D.    */.    c
7cf0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
7d00: 69 3b 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  i;..    char *zR
7d10: 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  et = sqlite3Mall
7d20: 6f 63 5a 65 72 6f 28 20 28 70 2d 3e 6e 4b 65 79  ocZero( (p->nKey
7d30: 43 6f 6c 2b 31 29 2a 32 35 20 29 3b 0a 20 20 20  Col+1)*25 );.   
7d40: 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a   if( zRet==0 ){.
7d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7d60: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
7d70: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
7d80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
7d90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7da0: 69 6e 74 66 28 32 34 2c 20 7a 52 65 74 2c 20 22  intf(24, zRet, "
7db0: 25 6c 6c 75 22 2c 20 28 75 36 34 29 70 2d 3e 6e  %llu", (u64)p->n
7dc0: 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52  Row);.    z = zR
7dd0: 65 74 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  et + sqlite3Strl
7de0: 65 6e 33 30 28 7a 52 65 74 29 3b 0a 20 20 20 20  en30(zRet);.    
7df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4b  for(i=0; i<p->nK
7e00: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
7e10: 20 20 20 75 36 34 20 6e 44 69 73 74 69 6e 63 74     u64 nDistinct
7e20: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
7e30: 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20  DLt[i] + 1;.    
7e40: 20 20 75 36 34 20 69 56 61 6c 20 3d 20 28 70 2d    u64 iVal = (p-
7e50: 3e 6e 52 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63  >nRow + nDistinc
7e60: 74 20 2d 20 31 29 20 2f 20 6e 44 69 73 74 69 6e  t - 1) / nDistin
7e70: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
7e80: 33 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a  3_snprintf(24, z
7e90: 2c 20 22 20 25 6c 6c 75 22 2c 20 69 56 61 6c 29  , " %llu", iVal)
7ea0: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
7eb0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
7ec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7ed0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
7ee0: 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ] );.    }.    a
7ef0: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30  ssert( z[0]=='\0
7f00: 27 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a  ' && z>zRet );..
7f10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7f20: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
7f30: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
7f40: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69  e3_free);.  }.#i
7f50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7f60: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
7f70: 34 0a 20 20 65 6c 73 65 20 69 66 28 20 65 43 61  4.  else if( eCa
7f80: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7f90: 49 44 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ID ){.    if( p-
7fa0: 3e 69 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  >iGet<0 ){.     
7fb0: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
7fc0: 6f 75 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  ous(p, 0);.     
7fd0: 20 70 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20   p->iGet = 0;.  
7fe0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
7ff0: 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29  Get<p->nSample )
8000: 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53 61 6d  {.      Stat4Sam
8010: 70 6c 65 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b  ple *pS = p->a +
8020: 20 70 2d 3e 69 47 65 74 3b 0a 20 20 20 20 20 20   p->iGet;.      
8030: 69 66 28 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d  if( pS->nRowid==
8040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
8050: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
8060: 34 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75  4(context, pS->u
8070: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
8080: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8090: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
80a0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e  ob(context, pS->
80b0: 75 2e 61 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52  u.aRowid, pS->nR
80c0: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
80f0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
8100: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8110: 74 52 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20  tRowcnt *aCnt = 
8120: 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  0;..    assert( 
8130: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
8140: 6c 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  le );.    switch
8150: 28 20 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20  ( eCall ){.     
8160: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
8170: 45 51 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  EQ:  aCnt = p->a
8180: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20  [p->iGet].anEq; 
8190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
81a0: 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20  e STAT_GET_NLT: 
81b0: 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e   aCnt = p->a[p->
81c0: 69 47 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61  iGet].anLt; brea
81d0: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
81e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74  : {.        aCnt
81f0: 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d   = p->a[p->iGet]
8200: 2e 61 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20  .anDLt; .       
8210: 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20   p->iGet++;.    
8220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8230: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
8240: 28 20 49 73 53 74 61 74 33 20 29 7b 0a 20 20 20  ( IsStat3 ){.   
8250: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8260: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
8270: 20 28 69 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a   (i64)aCnt[0]);.
8280: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8290: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
82a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
82b0: 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20  p->nCol * 25);. 
82c0: 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30       if( zRet==0
82d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
82e0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
82f0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8300: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8310: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8320: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a       char *z = z
8330: 52 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Ret;.        for
8340: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8350: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
8360: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8370: 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c 75 20 22  f(24, z, "%llu "
8380: 2c 20 28 75 36 34 29 61 43 6e 74 5b 69 5d 29 3b  , (u64)aCnt[i]);
8390: 0a 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  .          z += 
83a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
83b0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
83c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
83d0: 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52  0]=='\0' && z>zR
83e0: 65 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b  et );.        z[
83f0: 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
8400: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8410: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
8420: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
8430: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
8440: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
8450: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
8460: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
8470: 54 34 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  T4 */.#ifndef SQ
8480: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
8490: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61  SED_PARAMETER( a
84a0: 72 67 63 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rgc );.#endif.}.
84b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
84c0: 63 44 65 66 20 73 74 61 74 47 65 74 46 75 6e 63  cDef statGetFunc
84d0: 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49 73 53 74  def = {.  1+IsSt
84e0: 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41  at34,      /* nA
84f0: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
8500: 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63  TF8,     /* func
8510: 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  Flags */.  0,   
8520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
8530: 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c  UserData */.  0,
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8550: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61  * pNext */.  sta
8560: 74 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  tGet,         /*
8570: 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20   xSFunc */.  0, 
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8590: 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20   xFinalize */.  
85a0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
85b0: 20 2f 2a 20 78 56 61 6c 75 65 2c 20 78 49 6e 76   /* xValue, xInv
85c0: 65 72 73 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f  erse */.  "stat_
85d0: 67 65 74 22 2c 20 20 20 20 20 20 2f 2a 20 7a 4e  get",      /* zN
85e0: 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a  ame */.  {0}.};.
85f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c  .static void cal
8600: 6c 53 74 61 74 47 65 74 28 56 64 62 65 20 2a 76  lStatGet(Vdbe *v
8610: 2c 20 69 6e 74 20 72 65 67 53 74 61 74 34 2c 20  , int regStat4, 
8620: 69 6e 74 20 69 50 61 72 61 6d 2c 20 69 6e 74 20  int iParam, int 
8630: 72 65 67 4f 75 74 29 7b 0a 20 20 61 73 73 65 72  regOut){.  asser
8640: 74 28 20 72 65 67 4f 75 74 21 3d 72 65 67 53 74  t( regOut!=regSt
8650: 61 74 34 20 26 26 20 72 65 67 4f 75 74 21 3d 72  at4 && regOut!=r
8660: 65 67 53 74 61 74 34 2b 31 20 29 3b 0a 23 69 66  egStat4+1 );.#if
8670: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8680: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
8690: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
86a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
86b0: 65 72 2c 20 69 50 61 72 61 6d 2c 20 72 65 67 53  er, iParam, regS
86c0: 74 61 74 34 2b 31 29 3b 0a 23 65 6c 69 66 20 53  tat4+1);.#elif S
86d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 61 73  QLITE_DEBUG.  as
86e0: 73 65 72 74 28 20 69 50 61 72 61 6d 3d 3d 53 54  sert( iParam==ST
86f0: 41 54 5f 47 45 54 5f 53 54 41 54 31 20 29 3b 0a  AT_GET_STAT1 );.
8700: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
8710: 41 52 41 4d 45 54 45 52 28 20 69 50 61 72 61 6d  ARAMETER( iParam
8720: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c   );.#endif.  sql
8730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8740: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
8750: 30 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65 67  0, regStat4, reg
8760: 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
8770: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
8780: 26 73 74 61 74 47 65 74 46 75 6e 63 64 65 66 2c  &statGetFuncdef,
8790: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
87a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
87b0: 65 50 35 28 76 2c 20 31 20 2b 20 49 73 53 74 61  eP5(v, 1 + IsSta
87c0: 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  t34);.}../*.** G
87d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
87e0: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
87f0: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  f all indices as
8800: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
8810: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
8820: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8830: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
8840: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8850: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
8860: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
8870: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
8880: 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63  able whose indic
8890: 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61  es are to be ana
88a0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
88b0: 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49   *pOnlyIdx, /* I
88c0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79  f not NULL, only
88d0: 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e   analyze this on
88e0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
88f0: 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a   iStatCur,    /*
8900: 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75   Index of VdbeCu
8910: 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65 73  rsor that writes
8920: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
8930: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  1 table */.  int
8940: 20 69 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a   iMem,        /*
8950: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
8960: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69  y locations begi
8970: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
8980: 69 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20  iTab         /* 
8990: 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63  Next available c
89a0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ursor */.){.  sq
89b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
89c0: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61  se->db;    /* Da
89d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
89e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
8a10: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
8a20: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
8a50: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  n index being an
8a60: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
8a70: 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
8a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8a90: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64  e cursor */.  Vd
8aa0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
8ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8ac0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8ad0: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
8ae0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8b10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72  er */.  int jZer
8b20: 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20  oRows = -1;     
8b30: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
8b40: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
8b50: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
8b60: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
8b90: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
8ba0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20  ng pTab */.  u8 
8bb0: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31  needTableCnt = 1
8bc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
8bd0: 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74  e to count the t
8be0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
8bf0: 67 4e 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d  gNewRowid = iMem
8c00: 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ++;    /* Rowid 
8c10: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 65 64  for the inserted
8c20: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
8c30: 20 72 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d   regStat4 = iMem
8c40: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ++;       /* Reg
8c50: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74  ister to hold St
8c60: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
8c70: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67  */.  int regChng
8c80: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
8c90: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
8ca0: 61 6e 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c  anged index fiel
8cb0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
8cc0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8cd0: 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 72  OR_STAT4.  int r
8ce0: 65 67 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b  egRowid = iMem++
8cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
8d00: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
8d10: 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28 29 20   to stat_push() 
8d20: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
8d30: 72 65 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b  regTemp = iMem++
8d40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ;        /* Temp
8d50: 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
8d60: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54  er */.  int regT
8d70: 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b  abname = iMem++;
8d80: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
8d90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
8da0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
8db0: 72 65 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65  regIdxname = iMe
8dc0: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8dd0: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8de0: 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  index name */.  
8df0: 69 6e 74 20 72 65 67 53 74 61 74 31 20 3d 20 69  int regStat1 = i
8e00: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8e10: 56 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 74  Value for the st
8e20: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c  at column of sql
8e30: 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 69  ite_stat1 */.  i
8e40: 6e 74 20 72 65 67 50 72 65 76 20 3d 20 69 4d 65  nt regPrev = iMe
8e50: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  m;          /* M
8e60: 55 53 54 20 42 45 20 4c 41 53 54 20 28 73 65 65  UST BE LAST (see
8e70: 20 62 65 6c 6f 77 29 20 2a 2f 0a 23 69 66 64 65   below) */.#ifde
8e80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e90: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
8ea0: 20 54 61 62 6c 65 20 2a 70 53 74 61 74 31 20 3d   Table *pStat1 =
8eb0: 20 30 3b 20 0a 23 65 6e 64 69 66 0a 0a 20 20 70   0; .#endif..  p
8ec0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
8ed0: 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  X(pParse->nMem, 
8ee0: 69 4d 65 6d 29 3b 0a 20 20 76 20 3d 20 73 71 6c  iMem);.  v = sql
8ef0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
8f00: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
8f10: 7c 7c 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30  || NEVER(pTab==0
8f20: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
8f30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
8f40: 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
8f50: 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72  /* Do not gather
8f60: 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 76   statistics on v
8f70: 69 65 77 73 20 6f 72 20 76 69 72 74 75 61 6c 20  iews or virtual 
8f80: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65  tables */.    re
8f90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
8fa0: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
8fb0: 22 73 71 6c 69 74 65 5c 5c 5f 25 22 2c 20 70 54  "sqlite\\_%", pT
8fc0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 27 5c 5c 27 29  ab->zName, '\\')
8fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ==0 ){.    /* Do
8fe0: 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61 74   not gather stat
8ff0: 69 73 74 69 63 73 20 6f 6e 20 73 79 73 74 65 6d  istics on system
9000: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72   tables */.    r
9010: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
9020: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
9030: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
9040: 28 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20  (db) );.  iDb = 
9050: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
9060: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
9070: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
9080: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 61  t( iDb>=0 );.  a
9090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
90a0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
90b0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 23 69 66  , iDb, 0) );.#if
90c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
90d0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
90e0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
90f0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
9100: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54  LITE_ANALYZE, pT
9110: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ab->zName, 0,.  
9120: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
9130: 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
9140: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
9150: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
9160: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
9170: 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 69 66 28  PDATE_HOOK.  if(
9180: 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
9190: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  allback ){.    p
91a0: 53 74 61 74 31 20 3d 20 28 54 61 62 6c 65 2a 29  Stat1 = (Table*)
91b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
91c0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
91d0: 61 62 6c 65 29 20 2b 20 31 33 29 3b 0a 20 20 20  able) + 13);.   
91e0: 20 69 66 28 20 70 53 74 61 74 31 3d 3d 30 20 29   if( pStat1==0 )
91f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 74   return;.    pSt
9200: 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  at1->zName = (ch
9210: 61 72 2a 29 26 70 53 74 61 74 31 5b 31 5d 3b 0a  ar*)&pStat1[1];.
9220: 20 20 20 20 6d 65 6d 63 70 79 28 70 53 74 61 74      memcpy(pStat
9230: 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  1->zName, "sqlit
9240: 65 5f 73 74 61 74 31 22 2c 20 31 33 29 3b 0a 20  e_stat1", 13);. 
9250: 20 20 20 70 53 74 61 74 31 2d 3e 6e 43 6f 6c 20     pStat1->nCol 
9260: 3d 20 33 3b 0a 20 20 20 20 70 53 74 61 74 31 2d  = 3;.    pStat1-
9270: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
9280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9290: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
92a0: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c  , OP_Noop, 0, 0,
92b0: 20 30 2c 28 63 68 61 72 2a 29 70 53 74 61 74 31   0,(char*)pStat1
92c0: 2c 50 34 5f 44 59 4e 42 4c 4f 42 29 3b 0a 20 20  ,P4_DYNBLOB);.  
92d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
92e0: 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 2d  stablish a read-
92f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
9300: 65 20 61 74 20 74 68 65 20 73 68 61 72 65 64 2d  e at the shared-
9310: 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20  cache level. .  
9320: 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  ** Open a read-o
9330: 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  nly cursor on th
9340: 65 20 74 61 62 6c 65 2e 20 41 6c 73 6f 20 61 6c  e table. Also al
9350: 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 20  locate a cursor 
9360: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 74 6f 20 75  number.  ** to u
9370: 73 65 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  se for scanning 
9380: 69 6e 64 65 78 65 73 20 28 69 49 64 78 43 75 72  indexes (iIdxCur
9390: 29 2e 20 4e 6f 20 69 6e 64 65 78 20 63 75 72 73  ). No index curs
93a0: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 61 74 0a  or is opened at.
93b0: 20 20 2a 2a 20 74 68 69 73 20 74 69 6d 65 20 74    ** this time t
93c0: 68 6f 75 67 68 2e 20 20 2a 2f 0a 20 20 73 71 6c  hough.  */.  sql
93d0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
93e0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
93f0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
9400: 7a 4e 61 6d 65 29 3b 0a 20 20 69 54 61 62 43 75  zName);.  iTabCu
9410: 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 69 49  r = iTab++;.  iI
9420: 64 78 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  dxCur = iTab++;.
9430: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
9440: 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 54 61   MAX(pParse->nTa
9450: 62 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  b, iTab);.  sqli
9460: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
9470: 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44  rse, iTabCur, iD
9480: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
9490: 52 65 61 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  Read);.  sqlite3
94a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
94b0: 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 70 54  , regTabname, pT
94c0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 66  ab->zName);..  f
94d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
94e0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
94f0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9500: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
9530: 6c 75 6d 6e 73 20 69 6e 20 70 49 64 78 2e 20 22  lumns in pIdx. "
9540: 4e 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  N" */.    int ad
9550: 64 72 52 65 77 69 6e 64 3b 20 20 20 20 20 20 20  drRewind;       
9560: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
9570: 73 73 20 6f 66 20 22 4f 50 5f 52 65 77 69 6e 64  ss of "OP_Rewind
9580: 20 69 49 64 78 43 75 72 22 20 2a 2f 0a 20 20 20   iIdxCur" */.   
9590: 20 69 6e 74 20 61 64 64 72 4e 65 78 74 52 6f 77   int addrNextRow
95a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
95b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22 6e 65  * Address of "ne
95c0: 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a 20 20 20 20  xt_row:" */.    
95d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
95e0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
95f0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
9600: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ex */.    int nC
9610: 6f 6c 54 65 73 74 3b 20 20 20 20 20 20 20 20 20  olTest;         
9620: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9630: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  r of columns to 
9640: 74 65 73 74 20 66 6f 72 20 63 68 61 6e 67 65 73  test for changes
9650: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f 6e   */..    if( pOn
9660: 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c 79 49 64  lyIdx && pOnlyId
9670: 78 21 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e  x!=pIdx ) contin
9680: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ue;.    if( pIdx
9690: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
96a0: 3d 30 20 29 20 6e 65 65 64 54 61 62 6c 65 43 6e  =0 ) needTableCn
96b0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
96c0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
96d0: 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  & IsPrimaryKeyIn
96e0: 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20  dex(pIdx) ){.   
96f0: 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e     nCol = pIdx->
9700: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7a  nKeyCol;.      z
9710: 49 64 78 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  IdxName = pTab->
9720: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f  zName;.      nCo
9730: 6c 54 65 73 74 20 3d 20 6e 43 6f 6c 20 2d 20 31  lTest = nCol - 1
9740: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9750: 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e     nCol = pIdx->
9760: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7a  nColumn;.      z
9770: 49 64 78 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e  IdxName = pIdx->
9780: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f  zName;.      nCo
9790: 6c 54 65 73 74 20 3d 20 70 49 64 78 2d 3e 75 6e  lTest = pIdx->un
97a0: 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78  iqNotNull ? pIdx
97b0: 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 3a 20 6e 43  ->nKeyCol-1 : nC
97c0: 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ol-1;.    }..   
97d0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
97e0: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   register contai
97f0: 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e  ning the index n
9800: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ame. */.    sqli
9810: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
9820: 67 28 76 2c 20 72 65 67 49 64 78 6e 61 6d 65 2c  g(v, regIdxname,
9830: 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 20 20   zIdxName);.    
9840: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
9850: 22 41 6e 61 6c 79 73 69 73 20 66 6f 72 20 25 73  "Analysis for %s
9860: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
9870: 65 2c 20 7a 49 64 78 4e 61 6d 65 29 29 3b 0a 0a  e, zIdxName));..
9880: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 73      /*.    ** Ps
9890: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 6c 6f  eudo-code for lo
98a0: 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20 73 74  op that calls st
98b0: 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20 20 2a  at_push():.    *
98c0: 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e  *.    **   Rewin
98d0: 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69  d csr.    **   i
98e0: 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20  f eof(csr) goto 
98f0: 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20  end_of_scan;.   
9900: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
9910: 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20  0.    **   goto 
9920: 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20 20 20  chng_addr_0;.   
9930: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74   **.    **  next
9940: 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72  _row:.    **   r
9950: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a  egChng = 0.    *
9960: 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20 21  *   if( idx(0) !
9970: 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20 67  = regPrev(0) ) g
9980: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a  oto chng_addr_0.
9990: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
99a0: 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 1.    **   if
99b0: 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67 50  ( idx(1) != regP
99c0: 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68  rev(1) ) goto ch
99d0: 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a  ng_addr_1.    **
99e0: 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20     ....    **   
99f0: 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20  regChng = N.    
9a00: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
9a10: 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  ddr_N.    **.   
9a20: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 30   **  chng_addr_0
9a30: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72  :.    **   regPr
9a40: 65 76 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20  ev(0) = idx(0). 
9a50: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
9a60: 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _1:.    **   reg
9a70: 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31 29  Prev(1) = idx(1)
9a80: 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20  .    **  ....   
9a90: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64 44   **.    **  endD
9aa0: 69 73 74 69 6e 63 74 54 65 73 74 3a 0a 20 20 20  istinctTest:.   
9ab0: 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d   **   regRowid =
9ac0: 20 69 64 78 28 72 6f 77 69 64 29 0a 20 20 20 20   idx(rowid).    
9ad0: 2a 2a 20 20 20 73 74 61 74 5f 70 75 73 68 28 50  **   stat_push(P
9ae0: 2c 20 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f  , regChng, regRo
9af0: 77 69 64 29 0a 20 20 20 20 2a 2a 20 20 20 4e 65  wid).    **   Ne
9b00: 78 74 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20  xt csr.    **   
9b10: 69 66 20 21 65 6f 66 28 63 73 72 29 20 67 6f 74  if !eof(csr) got
9b20: 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20  o next_row;.    
9b30: 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64 5f 6f  **.    **  end_o
9b40: 66 5f 73 63 61 6e 3a 0a 20 20 20 20 2a 2f 0a 0a  f_scan:.    */..
9b50: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9b60: 20 74 68 65 72 65 20 61 72 65 20 65 6e 6f 75 67   there are enoug
9b70: 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  h memory cells a
9b80: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 63 63 6f  llocated to acco
9b90: 6d 6d 6f 64 61 74 65 20 0a 20 20 20 20 2a 2a 20  mmodate .    ** 
9ba0: 74 68 65 20 72 65 67 50 72 65 76 20 61 72 72 61  the regPrev arra
9bb0: 79 20 61 6e 64 20 61 20 74 72 61 69 6c 69 6e 67  y and a trailing
9bc0: 20 72 6f 77 69 64 20 28 74 68 65 20 72 6f 77 69   rowid (the rowi
9bd0: 64 20 73 6c 6f 74 20 69 73 20 72 65 71 75 69 72  d slot is requir
9be0: 65 64 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 62  ed.    ** when b
9bf0: 75 69 6c 64 69 6e 67 20 61 20 72 65 63 6f 72 64  uilding a record
9c00: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
9c10: 74 68 65 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d  the sample colum
9c20: 6e 20 6f 66 20 0a 20 20 20 20 2a 2a 20 74 68 65  n of .    ** the
9c30: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
9c40: 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 70 50 61  ble.  */.    pPa
9c50: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28  rse->nMem = MAX(
9c60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65  pParse->nMem, re
9c70: 67 50 72 65 76 2b 6e 43 6f 6c 54 65 73 74 29 3b  gPrev+nColTest);
9c80: 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20  ..    /* Open a 
9c90: 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
9ca0: 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 62 65   on the index be
9cb0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f  ing analyzed. */
9cc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
9cd0: 3d 3d 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  ==sqlite3SchemaT
9ce0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d  oIndex(db, pIdx-
9cf0: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
9d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9d10: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
9d20: 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64 78  d, iIdxCur, pIdx
9d30: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
9d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
9d50: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
9d60: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 56 64 62  , pIdx);.    Vdb
9d70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
9d80: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
9d90: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  ;..    /* Invoke
9da0: 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28 29   the stat_init()
9db0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 61   function. The a
9dc0: 72 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20 20  rguments are:.  
9dd0: 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 20    ** .    **    
9de0: 28 31 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  (1) the number o
9df0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9e00: 20 69 6e 64 65 78 20 69 6e 63 6c 75 64 69 6e 67   index including
9e10: 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20 2a   the rowid.    *
9e20: 2a 20 20 20 20 20 20 20 20 28 6f 72 20 66 6f 72  *        (or for
9e30: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
9e40: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 75 6d 62   table, the numb
9e50: 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75 6d 6e 73  er of PK columns
9e60: 29 2c 0a 20 20 20 20 2a 2a 20 20 20 20 28 32 29  ),.    **    (2)
9e70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9e80: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6b 65  olumns in the ke
9e90: 79 20 77 69 74 68 6f 75 74 20 74 68 65 20 72 6f  y without the ro
9ea0: 77 69 64 2f 70 6b 0a 20 20 20 20 2a 2a 20 20 20  wid/pk.    **   
9eb0: 20 28 33 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (3) the number 
9ec0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
9ed0: 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex,.    **.   
9ee0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
9ef0: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
9f00: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53   only used for S
9f10: 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 0a 20  TAT3 and STAT4. 
9f20: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
9f30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
9f40: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
9f50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9f60: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64  v, OP_Count, iId
9f70: 78 43 75 72 2c 20 72 65 67 53 74 61 74 34 2b 33  xCur, regStat4+3
9f80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
9f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9fa0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
9fb0: 43 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b 31 29  Col, regStat4+1)
9fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9fd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9fe0: 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6e 4b 65  teger, pIdx->nKe
9ff0: 79 43 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b 32  yCol, regStat4+2
a000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a010: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
a020: 75 6e 63 74 69 6f 6e 30 2c 20 30 2c 20 72 65 67  unction0, 0, reg
a030: 53 74 61 74 34 2b 31 2c 20 72 65 67 53 74 61 74  Stat4+1, regStat
a040: 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4,.             
a050: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26          (char*)&
a060: 73 74 61 74 49 6e 69 74 46 75 6e 63 64 65 66 2c  statInitFuncdef,
a070: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
a080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a090: 6e 67 65 50 35 28 76 2c 20 32 2b 49 73 53 74 61  ngeP5(v, 2+IsSta
a0a0: 74 33 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6d  t34);..    /* Im
a0b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
a0c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
a0d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52     **.    **   R
a0e0: 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a  ewind csr.    **
a0f0: 20 20 20 69 66 20 65 6f 66 28 63 73 72 29 20 67     if eof(csr) g
a100: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b  oto end_of_scan;
a110: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
a120: 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67  g = 0.    **   g
a130: 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68 5f 30 3b  oto next_push_0;
a140: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
a150: 20 20 20 61 64 64 72 52 65 77 69 6e 64 20 3d 20     addrRewind = 
a160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a170: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
a180: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64  iIdxCur);.    Vd
a190: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a1a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a1c0: 65 72 2c 20 30 2c 20 72 65 67 43 68 6e 67 29 3b  er, 0, regChng);
a1d0: 0a 20 20 20 20 61 64 64 72 4e 65 78 74 52 6f 77  .    addrNextRow
a1e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
a1f0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
a200: 20 20 20 69 66 28 20 6e 43 6f 6c 54 65 73 74 3e     if( nColTest>
a210: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  0 ){.      int e
a220: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 20 3d  ndDistinctTest =
a230: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
a240: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
a250: 20 20 20 20 20 69 6e 74 20 2a 61 47 6f 74 6f 43       int *aGotoC
a260: 68 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  hng;            
a270: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a     /* Array of j
a280: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ump instruction 
a290: 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 20  addresses */.   
a2a0: 20 20 20 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73     aGotoChng = s
a2b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a2c0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  wNN(db, sizeof(i
a2d0: 6e 74 29 2a 6e 43 6f 6c 54 65 73 74 29 3b 0a 20  nt)*nColTest);. 
a2e0: 20 20 20 20 20 69 66 28 20 61 47 6f 74 6f 43 68       if( aGotoCh
a2f0: 6e 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ng==0 ) continue
a300: 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  ;..      /*.    
a310: 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a    **  next_row:.
a320: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68        **   regCh
a330: 6e 67 20 3d 20 30 0a 20 20 20 20 20 20 2a 2a 20  ng = 0.      ** 
a340: 20 20 69 66 28 20 69 64 78 28 30 29 20 21 3d 20    if( idx(0) != 
a350: 72 65 67 50 72 65 76 28 30 29 20 29 20 67 6f 74  regPrev(0) ) got
a360: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20  o chng_addr_0.  
a370: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
a380: 20 3d 20 31 0a 20 20 20 20 20 20 2a 2a 20 20 20   = 1.      **   
a390: 69 66 28 20 69 64 78 28 31 29 20 21 3d 20 72 65  if( idx(1) != re
a3a0: 67 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20  gPrev(1) ) goto 
a3b0: 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20  chng_addr_1.    
a3c0: 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 20    **   ....     
a3d0: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
a3e0: 4e 0a 20 20 20 20 20 20 2a 2a 20 20 20 67 6f 74  N.      **   got
a3f0: 6f 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73  o endDistinctTes
a400: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
a410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a420: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
a430: 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 52 6f        addrNextRo
a440: 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
a450: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
a460: 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65 73       if( nColTes
a470: 74 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6e 4b  t==1 && pIdx->nK
a480: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e  eyCol==1 && IsUn
a490: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
a4a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
a4b0: 72 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d  r a single-colum
a4c0: 6e 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20  n UNIQUE index, 
a4d0: 6f 6e 63 65 20 77 65 20 68 61 76 65 20 66 6f 75  once we have fou
a4e0: 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 20 20  nd a non-NULL.  
a4f0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 2c 20 77 65        ** row, we
a500: 20 6b 6e 6f 77 20 74 68 61 74 20 61 6c 6c 20 74   know that all t
a510: 68 65 20 72 65 73 74 20 77 69 6c 6c 20 62 65 20  he rest will be 
a520: 64 69 73 74 69 6e 63 74 2c 20 73 6f 20 73 6b 69  distinct, so ski
a530: 70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  p .        ** su
a540: 62 73 65 71 75 65 6e 74 20 64 69 73 74 69 6e 63  bsequent distinc
a550: 74 6e 65 73 73 20 74 65 73 74 73 2e 20 2a 2f 0a  tness tests. */.
a560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a580: 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 50 72 65 76  NotNull, regPrev
a590: 2c 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73  , endDistinctTes
a5a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
a5b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a5c0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a5d0: 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20  =0; i<nColTest; 
a5e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
a5f0: 61 72 20 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61  ar *pColl = (cha
a600: 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  r*)sqlite3Locate
a610: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a620: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29  pIdx->azColl[i])
a630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a640: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a650: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 72 65  P_Integer, i, re
a660: 67 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  gChng);.        
a670: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a680: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
a690: 69 49 64 78 43 75 72 2c 20 69 2c 20 72 65 67 54  iIdxCur, i, regT
a6a0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 47  emp);.        aG
a6b0: 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d 20 0a 20 20  otoChng[i] = .  
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6d0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
a6e0: 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 72 65  , regTemp, 0, re
a6f0: 67 50 72 65 76 2b 69 2c 20 70 43 6f 6c 6c 2c 20  gPrev+i, pColl, 
a700: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
a710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a720: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
a730: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
a740: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a750: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
a760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a770: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a780: 65 72 2c 20 6e 43 6f 6c 54 65 73 74 2c 20 72 65  er, nColTest, re
a790: 67 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 73 71  gChng);.      sq
a7a0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
a7b0: 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74   endDistinctTest
a7c0: 29 3b 0a 20 20 0a 20 20 0a 20 20 20 20 20 20 2f  );.  .  .      /
a7d0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 63 68 6e 67  *.      **  chng
a7e0: 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20 20 20 2a  _addr_0:.      *
a7f0: 2a 20 20 20 72 65 67 50 72 65 76 28 30 29 20 3d  *   regPrev(0) =
a800: 20 69 64 78 28 30 29 0a 20 20 20 20 20 20 2a 2a   idx(0).      **
a810: 20 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20    chng_addr_1:. 
a820: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65       **   regPre
a830: 76 28 31 29 20 3d 20 69 64 78 28 31 29 0a 20 20  v(1) = idx(1).  
a840: 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20      **  ....    
a850: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
a860: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a870: 2c 20 61 64 64 72 4e 65 78 74 52 6f 77 2d 31 29  , addrNextRow-1)
a880: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a890: 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20 69 2b 2b   i<nColTest; i++
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a8b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a8c0: 2c 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b  , aGotoChng[i]);
a8d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a8e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a8f0: 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
a900: 2c 20 69 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  , i, regPrev+i);
a910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a920: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
a930: 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 44 69 73  eLabel(v, endDis
a940: 74 69 6e 63 74 54 65 73 74 29 3b 0a 20 20 20 20  tinctTest);.    
a950: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a960: 64 62 2c 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a  db, aGotoChng);.
a970: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 0a      }.  .    /*.
a980: 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64      **  chng_add
a990: 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65  r_N:.    **   re
a9a0: 67 52 6f 77 69 64 20 3d 20 69 64 78 28 72 6f 77  gRowid = idx(row
a9b0: 69 64 29 20 20 20 20 20 20 20 20 20 20 20 20 2f  id)            /
a9c0: 2f 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20  / STAT34 only.  
a9d0: 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75 73 68    **   stat_push
a9e0: 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72 65 67  (P, regChng, reg
a9f0: 52 6f 77 69 64 29 20 20 2f 2f 20 33 72 64 20 70  Rowid)  // 3rd p
aa00: 61 72 61 6d 65 74 65 72 20 53 54 41 54 33 34 20  arameter STAT34 
aa10: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 4e 65  only.    **   Ne
aa20: 78 74 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20  xt csr.    **   
aa30: 69 66 20 21 65 6f 66 28 63 73 72 29 20 67 6f 74  if !eof(csr) got
aa40: 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20  o next_row;.    
aa50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
aa60: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
aa70: 5f 53 54 41 54 34 0a 20 20 20 20 61 73 73 65 72  _STAT4.    asser
aa80: 74 28 20 72 65 67 52 6f 77 69 64 3d 3d 28 72 65  t( regRowid==(re
aa90: 67 53 74 61 74 34 2b 32 29 20 29 3b 0a 20 20 20  gStat4+2) );.   
aaa0: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
aab0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ab) ){.      sql
aac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aad0: 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
aae0: 49 64 78 43 75 72 2c 20 72 65 67 52 6f 77 69 64  IdxCur, regRowid
aaf0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ab00: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
ab10: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
ab20: 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54  eyIndex(pIdx->pT
ab30: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  able);.      int
ab40: 20 6a 2c 20 6b 2c 20 72 65 67 4b 65 79 3b 0a 20   j, k, regKey;. 
ab50: 20 20 20 20 20 72 65 67 4b 65 79 20 3d 20 73 71       regKey = sq
ab60: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
ab70: 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e  e(pParse, pPk->n
ab80: 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66  KeyCol);.      f
ab90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
aba0: 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
abb0: 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65        k = sqlite
abc0: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
abd0: 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Idx, pPk->aiColu
abe0: 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  mn[j]);.        
abf0: 61 73 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20  assert( k>=0 && 
ac00: 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  k<pIdx->nColumn 
ac10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ac20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ac30: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
ac40: 75 72 2c 20 6b 2c 20 72 65 67 4b 65 79 2b 6a 29  ur, k, regKey+j)
ac50: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ac60: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
ac70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
ac80: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
ac90: 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
aca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
acb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
acc0: 52 65 63 6f 72 64 2c 20 72 65 67 4b 65 79 2c 20  Record, regKey, 
acd0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65  pPk->nKeyCol, re
ace0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
acf0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ad00: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
ad10: 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79  egKey, pPk->nKey
ad20: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Col);.    }.#end
ad30: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  if.    assert( r
ad40: 65 67 43 68 6e 67 3d 3d 28 72 65 67 53 74 61 74  egChng==(regStat
ad50: 34 2b 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  4+1) );.    sqli
ad60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ad70: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 31   OP_Function0, 1
ad80: 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 54  , regStat4, regT
ad90: 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  emp,.           
ada0: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
adb0: 29 26 73 74 61 74 50 75 73 68 46 75 6e 63 64 65  )&statPushFuncde
adc0: 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
add0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ade0: 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49 73 53  hangeP5(v, 2+IsS
adf0: 74 61 74 33 34 29 3b 0a 20 20 20 20 73 71 6c 69  tat34);.    sqli
ae00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ae10: 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75   OP_Next, iIdxCu
ae20: 72 2c 20 61 64 64 72 4e 65 78 74 52 6f 77 29 3b  r, addrNextRow);
ae30: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae40: 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
ae50: 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 73  e entry to the s
ae60: 74 61 74 31 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tat1 table. */. 
ae70: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
ae80: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
ae90: 5f 47 45 54 5f 53 54 41 54 31 2c 20 72 65 67 53  _GET_STAT1, regS
aea0: 74 61 74 31 29 3b 0a 20 20 20 20 61 73 73 65 72  tat1);.    asser
aeb0: 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53 51 4c  t( "BBB"[0]==SQL
aec0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
aed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aee0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
aef0: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
af00: 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20  me, 3, regTemp, 
af10: 22 42 42 42 22 2c 20 30 29 3b 0a 20 20 20 20 73  "BBB", 0);.    s
af20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af30: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
af40: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65   iStatCur, regNe
af50: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
af60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
af70: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
af80: 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20  atCur, regTemp, 
af90: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 23 69  regNewRowid);.#i
afa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
afb0: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
afc0: 4b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  K.    sqlite3Vdb
afd0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
afe0: 20 28 63 68 61 72 2a 29 70 53 74 61 74 31 2c 20   (char*)pStat1, 
aff0: 50 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e 64 69  P4_TABLE);.#endi
b000: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
b010: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b020: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 0a 20 20  LAG_APPEND);..  
b030: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
b040: 72 69 65 73 20 74 6f 20 74 68 65 20 73 74 61 74  ries to the stat
b050: 33 20 6f 72 20 73 74 61 74 34 20 74 61 62 6c 65  3 or stat4 table
b060: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
b070: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
b080: 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 7b 0a 20  OR_STAT4.    {. 
b090: 20 20 20 20 20 69 6e 74 20 72 65 67 45 71 20 3d       int regEq =
b0a0: 20 72 65 67 53 74 61 74 31 3b 0a 20 20 20 20 20   regStat1;.     
b0b0: 20 69 6e 74 20 72 65 67 4c 74 20 3d 20 72 65 67   int regLt = reg
b0c0: 53 74 61 74 31 2b 31 3b 0a 20 20 20 20 20 20 69  Stat1+1;.      i
b0d0: 6e 74 20 72 65 67 44 4c 74 20 3d 20 72 65 67 53  nt regDLt = regS
b0e0: 74 61 74 31 2b 32 3b 0a 20 20 20 20 20 20 69 6e  tat1+2;.      in
b0f0: 74 20 72 65 67 53 61 6d 70 6c 65 20 3d 20 72 65  t regSample = re
b100: 67 53 74 61 74 31 2b 33 3b 0a 20 20 20 20 20 20  gStat1+3;.      
b110: 69 6e 74 20 72 65 67 43 6f 6c 20 3d 20 72 65 67  int regCol = reg
b120: 53 74 61 74 31 2b 34 3b 0a 20 20 20 20 20 20 69  Stat1+4;.      i
b130: 6e 74 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69  nt regSampleRowi
b140: 64 20 3d 20 72 65 67 43 6f 6c 20 2b 20 6e 43 6f  d = regCol + nCo
b150: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  l;.      int add
b160: 72 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74  rNext;.      int
b170: 20 61 64 64 72 49 73 4e 75 6c 6c 3b 0a 20 20 20   addrIsNull;.   
b180: 20 20 20 75 38 20 73 65 65 6b 4f 70 20 3d 20 48     u8 seekOp = H
b190: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20  asRowid(pTab) ? 
b1a0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f  OP_NotExists : O
b1b0: 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 20  P_NotFound;..   
b1c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
b1d0: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d  = MAX(pParse->nM
b1e0: 65 6d 2c 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 29  em, regCol+nCol)
b1f0: 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ;..      addrNex
b200: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
b210: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
b220: 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74       callStatGet
b230: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
b240: 41 54 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65  AT_GET_ROWID, re
b250: 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20  gSampleRowid);. 
b260: 20 20 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20       addrIsNull 
b270: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b280: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
b290: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
b2a0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
b2b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b2c0: 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72  callStatGet(v, r
b2d0: 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45  egStat4, STAT_GE
b2e0: 54 5f 4e 45 51 2c 20 72 65 67 45 71 29 3b 0a 20  T_NEQ, regEq);. 
b2f0: 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74       callStatGet
b300: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
b310: 41 54 5f 47 45 54 5f 4e 4c 54 2c 20 72 65 67 4c  AT_GET_NLT, regL
b320: 74 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74  t);.      callSt
b330: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
b340: 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54  4, STAT_GET_NDLT
b350: 2c 20 72 65 67 44 4c 74 29 3b 0a 20 20 20 20 20  , regDLt);.     
b360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b370: 70 34 49 6e 74 28 76 2c 20 73 65 65 6b 4f 70 2c  p4Int(v, seekOp,
b380: 20 69 54 61 62 43 75 72 2c 20 61 64 64 72 4e 65   iTabCur, addrNe
b390: 78 74 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77  xt, regSampleRow
b3a0: 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  id, 0);.      Vd
b3b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 23  beCoverage(v);.#
b3c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b3d0: 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20  BLE_STAT3.      
b3e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
b3f0: 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70  oadIndexColumn(p
b400: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61  Parse, pIdx, iTa
b410: 62 43 75 72 2c 20 30 2c 20 72 65 67 53 61 6d 70  bCur, 0, regSamp
b420: 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  le);.#else.     
b430: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
b460: 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70  oadIndexColumn(p
b470: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61  Parse, pIdx, iTa
b480: 62 43 75 72 2c 20 69 2c 20 72 65 67 43 6f 6c 2b  bCur, i, regCol+
b490: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
b4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b4b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b4c0: 63 6f 72 64 2c 20 72 65 67 43 6f 6c 2c 20 6e 43  cord, regCol, nC
b4d0: 6f 6c 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a  ol, regSample);.
b4e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c  #endif.      sql
b4f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b500: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b510: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20   regTabname, 6, 
b520: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b550: 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65  , iStatCur+1, re
b560: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
b570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b580: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
b590: 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65  , iStatCur+1, re
b5a0: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
b5b0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
b5c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b5d0: 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64 64 72  OP_Goto, 1, addr
b5e0: 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d 31 20  Next); /* P1==1 
b5f0: 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  for end-of-loop 
b600: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b610: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b620: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
b630: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b640: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
b650: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  _OR_STAT4 */..  
b660: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6e 61 6c    /* End of anal
b670: 79 73 69 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ysis */.    sqli
b680: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b690: 76 2c 20 61 64 64 72 52 65 77 69 6e 64 29 3b 0a  v, addrRewind);.
b6a0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74    }...  /* Creat
b6b0: 65 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74  e a single sqlit
b6c0: 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f  e_stat1 entry co
b6d0: 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73  ntaining NULL as
b6e0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
b6f0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77  name and the row
b700: 20 63 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f   count as the co
b710: 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntent..  */.  if
b720: 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26  ( pOnlyIdx==0 &&
b730: 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b   needTableCnt ){
b740: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b750: 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d  ((v, "%s", pTab-
b760: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
b770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b780: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61  v, OP_Count, iTa
b790: 62 43 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b  bCur, regStat1);
b7a0: 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d  .    jZeroRows =
b7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7c0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
b7d0: 72 65 67 53 74 61 74 31 29 3b 20 56 64 62 65 43  regStat1); VdbeC
b7e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b800: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
b810: 20 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20   regIdxname);.  
b820: 20 20 61 73 73 65 72 74 28 20 22 42 42 42 22 5b    assert( "BBB"[
b830: 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  0]==SQLITE_AFF_T
b840: 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  EXT );.    sqlit
b850: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b860: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
b870: 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65  egTabname, 3, re
b880: 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20 30 29  gTemp, "BBB", 0)
b890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b8a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b8b0: 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72  wRowid, iStatCur
b8c0: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b8e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b8f0: 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  rt, iStatCur, re
b900: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
b910: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
b920: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b930: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b950: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
b960: 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OOK.    sqlite3V
b970: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
b980: 31 2c 20 28 63 68 61 72 2a 29 70 53 74 61 74 31  1, (char*)pStat1
b990: 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e  , P4_TABLE);.#en
b9a0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
b9b0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
b9c0: 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d  ZeroRows);.  }.}
b9d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b9e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b9f0: 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20   cause the most 
ba00: 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61  recent index ana
ba10: 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c  lysis to.** be l
ba20: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
ba30: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
ba40: 77 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20  where is can be 
ba50: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
ba60: 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69  void loadAnalysi
ba70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
ba80: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
ba90: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
baa0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bab0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
bac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bad0: 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73  v, OP_LoadAnalys
bae0: 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a  is, iDb);.  }.}.
baf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bb00: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64  code that will d
bb10: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
bb20: 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
bb30: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ase.*/.static vo
bb40: 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61  id analyzeDataba
bb50: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
bb60: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
bb70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bb80: 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61  se->db;.  Schema
bb90: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
bba0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
bbb0: 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ;    /* Schema o
bbc0: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a  f database iDb *
bbd0: 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
bbe0: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b  .  int iStatCur;
bbf0: 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
bc00: 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69  nt iTab;..  sqli
bc10: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
bc20: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
bc30: 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43  , iDb);.  iStatC
bc40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
bc50: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
bc60: 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74  b += 3;.  openSt
bc70: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
bc80: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30  iDb, iStatCur, 0
bc90: 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70  , 0);.  iMem = p
bca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
bcb0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
bcc0: 6e 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  nTab;.  assert( 
bcd0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
bce0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
bcf0: 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71  0) );.  for(k=sq
bd00: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
bd10: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
bd20: 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
bd30: 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54  hNext(k)){.    T
bd40: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
bd50: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
bd60: 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c  ata(k);.    anal
bd70: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72  yzeOneTable(pPar
bd80: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74  se, pTab, 0, iSt
bd90: 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61  atCur, iMem, iTa
bda0: 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e  b);.  }.  loadAn
bdb0: 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69  alysis(pParse, i
bdc0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Db);.}../*.** Ge
bdd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bde0: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
bdf0: 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ysis of a single
be00: 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64   table in.** a d
be10: 61 74 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e  atabase.  If pOn
be20: 6c 79 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c  lyIdx is not NUL
be30: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73  L then it is a s
be40: 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69  ingle index.** i
be50: 6e 20 70 54 61 62 20 74 68 61 74 20 73 68 6f 75  n pTab that shou
be60: 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  ld be analyzed..
be70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
be80: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73  nalyzeTable(Pars
be90: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
bea0: 20 2a 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70   *pTab, Index *p
beb0: 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20  OnlyIdx){.  int 
bec0: 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74  iDb;.  int iStat
bed0: 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cur;..  assert( 
bee0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
bef0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
bf00: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
bf10: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
bf20: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
bf30: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
bf40: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
bf50: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
bf60: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
bf70: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
bf80: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
bf90: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
bfa0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
bfb0: 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e   += 3;.  if( pOn
bfc0: 6c 79 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65  lyIdx ){.    ope
bfd0: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
bfe0: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
bff0: 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d  , pOnlyIdx->zNam
c000: 65 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c  e, "idx");.  }el
c010: 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74  se{.    openStat
c020: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
c030: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61  b, iStatCur, pTa
c040: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29  b->zName, "tbl")
c050: 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f  ;.  }.  analyzeO
c060: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
c070: 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20  pTab, pOnlyIdx, 
c080: 69 53 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d  iStatCur,pParse-
c090: 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e  >nMem+1,pParse->
c0a0: 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61  nTab);.  loadAna
c0b0: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
c0c0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
c0d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c0e0: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
c0f0: 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  nd.  The parser 
c100: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
c110: 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65  ne.** when it re
c120: 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c  cognizes an ANAL
c130: 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
c140: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
c150: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
c170: 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  1.**        ANAL
c180: 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20  YZE  <database> 
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
c1a0: 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 2.**        AN
c1b0: 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73  ALYZE  ?<databas
c1c0: 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
c1d0: 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 3.**.** Form
c1e0: 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
c1f0: 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
c200: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
c210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  to be analyzed..
c220: 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a  ** Form 2 analyz
c230: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74  es all indices t
c240: 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  he single databa
c250: 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72  se named..** For
c260: 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 3 analyzes all
c270: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
c280: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
c290: 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ed table..*/.voi
c2a0: 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65  d sqlite3Analyze
c2b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c2c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
c2d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
c2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c2f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
c300: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   iDb;.  int i;. 
c310: 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a   char *z, *zDb;.
c320: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c330: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c340: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
c350: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  e;.  Vdbe *v;.. 
c360: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
c370: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
c380: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c390: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
c3a0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
c3b0: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
c3c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
c3d0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
c3e0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
c3f0: 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73  AllMutexes(pPars
c400: 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20  e->db) );.  if( 
c410: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
c420: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
c430: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
c440: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rn;.  }..  asser
c450: 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20  t( pName2!=0 || 
c460: 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69  pName1==0 );.  i
c470: 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
c480: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20      /* Form 1:  
c490: 41 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69  Analyze everythi
c4a0: 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ng */.    for(i=
c4b0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
c4c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
c4d0: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
c4e0: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a  /* Do not analyz
c4f0: 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
c500: 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61  ase */.      ana
c510: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61  lyzeDatabase(pPa
c520: 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
c530: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
c540: 32 2d 3e 6e 3d 3d 30 20 26 26 20 28 69 44 62 20  2->n==0 && (iDb 
c550: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
c560: 64 62 2c 20 70 4e 61 6d 65 31 29 29 3e 3d 30 20  db, pName1))>=0 
c570: 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a  ){.    /* Analyz
c580: 65 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  e the schema nam
c590: 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ed as the argume
c5a0: 6e 74 20 2a 2f 0a 20 20 20 20 61 6e 61 6c 79 7a  nt */.    analyz
c5b0: 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  eDatabase(pParse
c5c0: 2c 20 69 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iDb);.  }else{
c5d0: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20  .    /* Form 3: 
c5e0: 41 6e 61 6c 79 7a 65 20 74 68 65 20 74 61 62 6c  Analyze the tabl
c5f0: 65 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 64  e or index named
c600: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
c610: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
c620: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c630: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c640: 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e  pName2, &pTableN
c650: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
c660: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44  b>=0 ){.      zD
c670: 62 20 3d 20 70 4e 61 6d 65 32 2d 3e 6e 20 3f 20  b = pName2->n ? 
c680: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
c690: 53 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 20 20 20  SName : 0;.     
c6a0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
c6b0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
c6c0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ableName);.     
c6d0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
c6e0: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
c6f0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
c700: 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29  b, z, zDb))!=0 )
c710: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c  {.          anal
c720: 79 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  yzeTable(pParse,
c730: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70   pIdx->pTable, p
c740: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Idx);.        }e
c750: 6c 73 65 20 69 66 28 20 28 70 54 61 62 20 3d 20  lse if( (pTab = 
c760: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
c770: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c  le(pParse, 0, z,
c780: 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20   zDb))!=0 ){.   
c790: 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61         analyzeTa
c7a0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
c7b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
c7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
c7d0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
c7e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c7f0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 71 6c 45 78    if( db->nSqlEx
c800: 65 63 3d 3d 30 20 26 26 20 28 76 20 3d 20 73 71  ec==0 && (v = sq
c810: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c820: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
c830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c840: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
c850: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
c860: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
c870: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
c880: 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72 20  analyzer reader 
c890: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a  through to the.*
c8a0: 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  * callback routi
c8b0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
c8c0: 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e  truct analysisIn
c8d0: 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b  fo analysisInfo;
c8e0: 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73  .struct analysis
c8f0: 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33  Info {.  sqlite3
c900: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
c910: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d  ar *zDatabase;.}
c920: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  ;../*.** The fir
c930: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  st argument poin
c940: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
c950: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
c960: 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69  ntaining a.** li
c970: 73 74 20 6f 66 20 73 70 61 63 65 20 73 65 70 61  st of space sepa
c980: 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20  rated integers. 
c990: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 6e  Read the first n
c9a0: 4f 75 74 20 6f 66 20 74 68 65 73 65 20 69 6e 74  Out of these int
c9b0: 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61  o.** the array a
c9c0: 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  Out[]..*/.static
c9d0: 20 76 6f 69 64 20 64 65 63 6f 64 65 49 6e 74 41   void decodeIntA
c9e0: 72 72 61 79 28 0a 20 20 63 68 61 72 20 2a 7a 49  rray(.  char *zI
c9f0: 6e 74 41 72 72 61 79 2c 20 20 20 20 20 20 20 2f  ntArray,       /
ca00: 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * String contain
ca10: 69 6e 67 20 69 6e 74 20 61 72 72 61 79 20 74 6f  ing int array to
ca20: 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   decode */.  int
ca30: 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
ca40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ca50: 20 73 6c 6f 74 73 20 69 6e 20 61 4f 75 74 5b 5d   slots in aOut[]
ca60: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
ca70: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Out,         /* 
ca80: 53 74 6f 72 65 20 69 6e 74 65 67 65 72 73 20 68  Store integers h
ca90: 65 72 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ere */.  LogEst 
caa0: 2a 61 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  *aLog,          
cab0: 2f 2a 20 4f 72 2c 20 69 66 20 61 4f 75 74 3d 3d  /* Or, if aOut==
cac0: 30 2c 20 68 65 72 65 20 2a 2f 0a 20 20 49 6e 64  0, here */.  Ind
cad0: 65 78 20 2a 70 49 6e 64 65 78 20 20 20 20 20 20  ex *pIndex      
cae0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 65 78      /* Handle ex
caf0: 74 72 61 20 66 6c 61 67 73 20 66 6f 72 20 74 68  tra flags for th
cb00: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
cb10: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68   NULL */.){.  ch
cb20: 61 72 20 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61  ar *z = zIntArra
cb30: 79 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  y;.  int c;.  in
cb40: 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76  t i;.  tRowcnt v
cb50: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cb60: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
cb70: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d  _STAT4.  if( z==
cb80: 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73  0 ) z = "";.#els
cb90: 65 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  e.  assert( z!=0
cba0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72   );.#endif.  for
cbb0: 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f  (i=0; *z && i<nO
cbc0: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20  ut; i++){.    v 
cbd0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
cbe0: 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26  (c=z[0])>='0' &&
cbf0: 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20   c<='9' ){.     
cc00: 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20   v = v*10 + c - 
cc10: 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  '0';.      z++;.
cc20: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
cc30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
cc40: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 66  _OR_STAT4.    if
cc50: 28 20 61 4f 75 74 20 29 20 61 4f 75 74 5b 69 5d  ( aOut ) aOut[i]
cc60: 20 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 61 4c   = v;.    if( aL
cc70: 6f 67 20 29 20 61 4c 6f 67 5b 69 5d 20 3d 20 73  og ) aLog[i] = s
cc80: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b  qlite3LogEst(v);
cc90: 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65 72  .#else.    asser
cca0: 74 28 20 61 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  t( aOut==0 );.  
ccb0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ccc0: 45 52 28 61 4f 75 74 29 3b 0a 20 20 20 20 61 73  ER(aOut);.    as
ccd0: 73 65 72 74 28 20 61 4c 6f 67 21 3d 30 20 29 3b  sert( aLog!=0 );
cce0: 0a 20 20 20 20 61 4c 6f 67 5b 69 5d 20 3d 20 73  .    aLog[i] = s
ccf0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b  qlite3LogEst(v);
cd00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
cd10: 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20  *z==' ' ) z++;. 
cd20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
cd30: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
cd40: 52 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74  R_STAT4.  assert
cd50: 28 20 70 49 6e 64 65 78 21 3d 30 20 29 3b 20 7b  ( pIndex!=0 ); {
cd60: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 49 6e  .#else.  if( pIn
cd70: 64 65 78 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  dex ){.#endif.  
cd80: 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64    pIndex->bUnord
cd90: 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  ered = 0;.    pI
cda0: 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e  ndex->noSkipScan
cdb0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
cdc0: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69   z[0] ){.      i
cdd0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
cde0: 6f 62 28 22 75 6e 6f 72 64 65 72 65 64 2a 22 2c  ob("unordered*",
cdf0: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
ce00: 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64    pIndex->bUnord
ce10: 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ered = 1;.      
ce20: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ce30: 33 5f 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30  3_strglob("sz=[0
ce40: 2d 39 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a  -9]*", z)==0 ){.
ce50: 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
ce60: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
ce70: 65 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65 33  e3LogEst(sqlite3
ce80: 41 74 6f 69 28 7a 2b 33 29 29 3b 0a 20 20 20 20  Atoi(z+3));.    
ce90: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
cea0: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 73  te3_strglob("nos
ceb0: 6b 69 70 73 63 61 6e 2a 22 2c 20 7a 29 3d 3d 30  kipscan*", z)==0
cec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
ced0: 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d  ex->noSkipScan =
cee0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   1;.      }.#ifd
cef0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cf00: 5f 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 20 20  _COSTMULT.      
cf10: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
cf20: 5f 73 74 72 67 6c 6f 62 28 22 63 6f 73 74 6d 75  _strglob("costmu
cf30: 6c 74 3d 5b 30 2d 39 5d 2a 22 2c 7a 29 3d 3d 30  lt=[0-9]*",z)==0
cf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
cf50: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74  ex->pTable->cost
cf60: 4d 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Mult = sqlite3Lo
cf70: 67 45 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69  gEst(sqlite3Atoi
cf80: 28 7a 2b 39 29 29 3b 0a 20 20 20 20 20 20 7d 0a  (z+9));.      }.
cf90: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 69  #endif.      whi
cfa0: 6c 65 28 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a  le( z[0]!=0 && z
cfb0: 5b 30 5d 21 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a  [0]!=' ' ) z++;.
cfc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30        while( z[0
cfd0: 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]==' ' ) z++;.  
cfe0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
cff0: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
d000: 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
d010: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 77 68  or each index wh
d020: 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  en reading the.*
d030: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  * sqlite_stat1 t
d040: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20  able.  .**.**   
d050: 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65    argv[0] = name
d060: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
d070: 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e       argv[1] = n
d080: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
d090: 20 28 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 29   (might be NULL)
d0a0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20  .**     argv[2] 
d0b0: 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61  = results of ana
d0c0: 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67  lysis - on integ
d0d0: 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  er for each colu
d0e0: 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73  mn.**.** Entries
d0f0: 20 66 6f 72 20 77 68 69 63 68 20 61 72 67 76 5b   for which argv[
d100: 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  1]==NULL simply 
d110: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
d120: 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20  r of rows in.** 
d130: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
d140: 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69  atic int analysi
d150: 73 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44  sLoader(void *pD
d160: 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ata, int argc, c
d170: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
d180: 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61   **NotUsed){.  a
d190: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e  nalysisInfo *pIn
d1a0: 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e  fo = (analysisIn
d1b0: 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e 64  fo*)pData;.  Ind
d1c0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61  ex *pIndex;.  Ta
d1d0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
d1e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
d1f0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
d200: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
d210: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
d220: 20 61 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61   argc);..  if( a
d230: 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30  rgv==0 || argv[0
d240: 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d  ]==0 || argv[2]=
d250: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d260: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65   0;.  }.  pTable
d270: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
d280: 62 6c 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61  ble(pInfo->db, a
d290: 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a  rgv[0], pInfo->z
d2a0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
d2b0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
d2c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d2d0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30    if( argv[1]==0
d2e0: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d   ){.    pIndex =
d2f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
d300: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
d310: 61 72 67 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29  argv[0],argv[1])
d320: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  ==0 ){.    pInde
d330: 78 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  x = sqlite3Prima
d340: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 6c  ryKeyIndex(pTabl
d350: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
d360: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
d370: 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f  3FindIndex(pInfo
d380: 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70  ->db, argv[1], p
d390: 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29  Info->zDatabase)
d3a0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76  ;.  }.  z = argv
d3b0: 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64  [2];..  if( pInd
d3c0: 65 78 20 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e  ex ){.    tRowcn
d3d0: 74 20 2a 61 69 52 6f 77 45 73 74 20 3d 20 30 3b  t *aiRowEst = 0;
d3e0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
d3f0: 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  pIndex->nKeyCol+
d400: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
d410: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d420: 5f 53 54 41 54 34 0a 20 20 20 20 2f 2a 20 49 6e  _STAT4.    /* In
d430: 64 65 78 2e 61 69 52 6f 77 45 73 74 20 6d 61 79  dex.aiRowEst may
d440: 20 61 6c 72 65 61 64 79 20 62 65 20 73 65 74 20   already be set 
d450: 68 65 72 65 20 69 66 20 74 68 65 72 65 20 61 72  here if there ar
d460: 65 20 64 75 70 6c 69 63 61 74 65 20 0a 20 20 20  e duplicate .   
d470: 20 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31   ** sqlite_stat1
d480: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69   entries for thi
d490: 73 20 69 6e 64 65 78 2e 20 49 6e 20 74 68 61 74  s index. In that
d4a0: 20 63 61 73 65 20 6a 75 73 74 20 63 6c 6f 62 62   case just clobb
d4b0: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c  er.    ** the ol
d4c0: 64 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  d data with the 
d4d0: 6e 65 77 20 69 6e 73 74 65 61 64 20 6f 66 20 61  new instead of a
d4e0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
d4f0: 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 69  array.  */.    i
d500: 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  f( pIndex->aiRow
d510: 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Est==0 ){.      
d520: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
d530: 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 73 71 6c   = (tRowcnt*)sql
d540: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
d550: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a  izeof(tRowcnt) *
d560: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66   nCol);.      if
d570: 28 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  ( pIndex->aiRowE
d580: 73 74 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4f  st==0 ) sqlite3O
d590: 6f 6d 46 61 75 6c 74 28 70 49 6e 66 6f 2d 3e 64  omFault(pInfo->d
d5a0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 69  b);.    }.    ai
d5b0: 52 6f 77 45 73 74 20 3d 20 70 49 6e 64 65 78 2d  RowEst = pIndex-
d5c0: 3e 61 69 52 6f 77 45 73 74 3b 0a 23 65 6e 64 69  >aiRowEst;.#endi
d5d0: 66 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55  f.    pIndex->bU
d5e0: 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  nordered = 0;.  
d5f0: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
d600: 28 28 63 68 61 72 2a 29 7a 2c 20 6e 43 6f 6c 2c  ((char*)z, nCol,
d610: 20 61 69 52 6f 77 45 73 74 2c 20 70 49 6e 64 65   aiRowEst, pInde
d620: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 2c 20  x->aiRowLogEst, 
d630: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 49 6e  pIndex);.    pIn
d640: 64 65 78 2d 3e 68 61 73 53 74 61 74 31 20 3d 20  dex->hasStat1 = 
d650: 31 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  1;.    if( pInde
d660: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
d670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61  ==0 ){.      pTa
d680: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
d690: 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  = pIndex->aiRowL
d6a0: 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  ogEst[0];.      
d6b0: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
d6c0: 20 7c 3d 20 54 46 5f 48 61 73 53 74 61 74 31 3b   |= TF_HasStat1;
d6d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d6e0: 20 20 20 20 49 6e 64 65 78 20 66 61 6b 65 49 64      Index fakeId
d6f0: 78 3b 0a 20 20 20 20 66 61 6b 65 49 64 78 2e 73  x;.    fakeIdx.s
d700: 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 6c 65  zIdxRow = pTable
d710: 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 23 69 66 64  ->szTabRow;.#ifd
d720: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d730: 5f 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 66 61  _COSTMULT.    fa
d740: 6b 65 49 64 78 2e 70 54 61 62 6c 65 20 3d 20 70  keIdx.pTable = p
d750: 54 61 62 6c 65 3b 0a 23 65 6e 64 69 66 0a 20 20  Table;.#endif.  
d760: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
d770: 28 28 63 68 61 72 2a 29 7a 2c 20 31 2c 20 30 2c  ((char*)z, 1, 0,
d780: 20 26 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f   &pTable->nRowLo
d790: 67 45 73 74 2c 20 26 66 61 6b 65 49 64 78 29 3b  gEst, &fakeIdx);
d7a0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54  .    pTable->szT
d7b0: 61 62 52 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e  abRow = fakeIdx.
d7c0: 73 7a 49 64 78 52 6f 77 3b 0a 20 20 20 20 70 54  szIdxRow;.    pT
d7d0: 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c  able->tabFlags |
d7e0: 3d 20 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20  = TF_HasStat1;. 
d7f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
d800: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
d810: 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20 76 61  Index.aSample va
d820: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55  riable is not NU
d830: 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 61  LL, delete the a
d840: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 0a 2a  Sample[] array.*
d850: 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  * and its conten
d860: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
d870: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
d880: 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 20 2a 64  mples(sqlite3 *d
d890: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  b, Index *pIdx){
d8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d8b0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
d8c0: 54 41 54 34 0a 20 20 69 66 28 20 70 49 64 78 2d  TAT4.  if( pIdx-
d8d0: 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >aSample ){.    
d8e0: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
d8f0: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; j<pIdx->nSam
d900: 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ple; j++){.     
d910: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 20   IndexSample *p 
d920: 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  = &pIdx->aSample
d930: 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [j];.      sqlit
d940: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d950: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
d960: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d970: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a  pIdx->aSample);.
d980: 20 20 7d 0a 20 20 69 66 28 20 64 62 20 26 26 20    }.  if( db && 
d990: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
d9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 2d  ==0 ){.    pIdx-
d9b0: 3e 6e 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  >nSample = 0;.  
d9c0: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20    pIdx->aSample 
d9d0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  = 0;.  }.#else. 
d9e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d9f0: 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
da00: 50 41 52 41 4d 45 54 45 52 28 70 49 64 78 29 3b  PARAMETER(pIdx);
da10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
da20: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
da30: 52 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a 0a 23 69  R_STAT4 */.}..#i
da40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
da50: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
da60: 34 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  4./*.** Populate
da70: 20 74 68 65 20 70 49 64 78 2d 3e 61 41 76 67 45   the pIdx->aAvgE
da80: 71 5b 5d 20 61 72 72 61 79 20 62 61 73 65 64 20  q[] array based 
da90: 6f 6e 20 74 68 65 20 73 61 6d 70 6c 65 73 20 63  on the samples c
daa0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72  urrently.** stor
dab0: 65 64 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d  ed in pIdx->aSam
dac0: 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73 74 61 74 69  ple[]. .*/.stati
dad0: 63 20 76 6f 69 64 20 69 6e 69 74 41 76 67 45 71  c void initAvgEq
dae0: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
daf0: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
db00: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
db10: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
db20: 61 6d 70 6c 65 3b 0a 20 20 20 20 49 6e 64 65 78  ample;.    Index
db30: 53 61 6d 70 6c 65 20 2a 70 46 69 6e 61 6c 20 3d  Sample *pFinal =
db40: 20 26 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e   &aSample[pIdx->
db50: 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20  nSample-1];.    
db60: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  int iCol;.    in
db70: 74 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  t nCol = 1;.    
db80: 69 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  if( pIdx->nSampl
db90: 65 43 6f 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  eCol>1 ){.      
dba0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 73 74  /* If this is st
dbb0: 61 74 34 20 64 61 74 61 2c 20 74 68 65 6e 20 63  at4 data, then c
dbc0: 61 6c 63 75 6c 61 74 65 20 61 41 76 67 45 71 5b  alculate aAvgEq[
dbd0: 5d 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  ] values for all
dbe0: 0a 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  .      ** sample
dbf0: 20 63 6f 6c 75 6d 6e 73 20 65 78 63 65 70 74 20   columns except 
dc00: 74 68 65 20 6c 61 73 74 2e 20 54 68 65 20 6c 61  the last. The la
dc10: 73 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  st is always set
dc20: 20 74 6f 20 31 2c 20 61 73 0a 20 20 20 20 20 20   to 1, as.      
dc30: 2a 2a 20 6f 6e 63 65 20 74 68 65 20 74 72 61 69  ** once the trai
dc40: 6c 69 6e 67 20 50 4b 20 66 69 65 6c 64 73 20 61  ling PK fields a
dc50: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6c  re considered al
dc60: 6c 20 69 6e 64 65 78 20 6b 65 79 73 20 61 72 65  l index keys are
dc70: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65  .      ** unique
dc80: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c  .  */.      nCol
dc90: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
dca0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 70 49 64  Col-1;.      pId
dcb0: 78 2d 3e 61 41 76 67 45 71 5b 6e 43 6f 6c 5d 20  x->aAvgEq[nCol] 
dcc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 1;.    }.    f
dcd0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
dce0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
dcf0: 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65       int nSample
dd00: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
dd10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  ;.      int i;  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
dd40: 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 61 6d  rate through sam
dd50: 70 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52  ples */.      tR
dd60: 6f 77 63 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b  owcnt sumEq = 0;
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f          /* Sum o
dd80: 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73  f the nEq values
dd90: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
dda0: 74 20 61 76 67 45 71 20 3d 20 30 3b 0a 20 20 20  t avgEq = 0;.   
ddb0: 20 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b     tRowcnt nRow;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddd0: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
dde0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  n index */.     
ddf0: 20 69 36 34 20 6e 53 75 6d 31 30 30 20 3d 20 30   i64 nSum100 = 0
de00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
de10: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63 6f  mber of terms co
de20: 6e 74 72 69 62 75 74 69 6e 67 20 74 6f 20 73 75  ntributing to su
de30: 6d 45 71 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  mEq */.      i64
de40: 20 6e 44 69 73 74 31 30 30 3b 20 20 20 20 20 20   nDist100;      
de50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
de60: 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c   of distinct val
de70: 75 65 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  ues in index */.
de80: 0a 20 20 20 20 20 20 69 66 28 20 21 70 49 64 78  .      if( !pIdx
de90: 2d 3e 61 69 52 6f 77 45 73 74 20 7c 7c 20 69 43  ->aiRowEst || iC
dea0: 6f 6c 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ol>=pIdx->nKeyCo
deb0: 6c 20 7c 7c 20 70 49 64 78 2d 3e 61 69 52 6f 77  l || pIdx->aiRow
dec0: 45 73 74 5b 69 43 6f 6c 2b 31 5d 3d 3d 30 20 29  Est[iCol+1]==0 )
ded0: 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d  {.        nRow =
dee0: 20 70 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69 43   pFinal->anLt[iC
def0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e 44 69  ol];.        nDi
df00: 73 74 31 30 30 20 3d 20 28 69 36 34 29 31 30 30  st100 = (i64)100
df10: 20 2a 20 70 46 69 6e 61 6c 2d 3e 61 6e 44 4c 74   * pFinal->anDLt
df20: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
df30: 6e 53 61 6d 70 6c 65 2d 2d 3b 0a 20 20 20 20 20  nSample--;.     
df40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
df50: 6e 52 6f 77 20 3d 20 70 49 64 78 2d 3e 61 69 52  nRow = pIdx->aiR
df60: 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  owEst[0];.      
df70: 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28 28 69    nDist100 = ((i
df80: 36 34 29 31 30 30 20 2a 20 70 49 64 78 2d 3e 61  64)100 * pIdx->a
df90: 69 52 6f 77 45 73 74 5b 30 5d 29 20 2f 20 70 49  iRowEst[0]) / pI
dfa0: 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f  dx->aiRowEst[iCo
dfb0: 6c 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l+1];.      }.  
dfc0: 20 20 20 20 70 49 64 78 2d 3e 6e 52 6f 77 45 73      pIdx->nRowEs
dfd0: 74 30 20 3d 20 6e 52 6f 77 3b 0a 0a 20 20 20 20  t0 = nRow;..    
dfe0: 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d 20 74 6f    /* Set nSum to
dff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
e000: 69 73 74 69 6e 63 74 20 28 69 43 6f 6c 2b 31 29  istinct (iCol+1)
e010: 20 66 69 65 6c 64 20 70 72 65 66 69 78 65 73 20   field prefixes 
e020: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6f 63  that.      ** oc
e030: 63 75 72 20 69 6e 20 74 68 65 20 73 74 61 74 34  cur in the stat4
e040: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20   table for this 
e050: 69 6e 64 65 78 2e 20 53 65 74 20 73 75 6d 45 71  index. Set sumEq
e060: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 0a   to the sum of .
e070: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 45 71        ** the nEq
e080: 20 76 61 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75   values for colu
e090: 6d 6e 20 69 43 6f 6c 20 66 6f 72 20 74 68 65 20  mn iCol for the 
e0a0: 73 61 6d 65 20 73 65 74 20 28 61 64 64 69 6e 67  same set (adding
e0b0: 20 74 68 65 20 76 61 6c 75 65 20 0a 20 20 20 20   the value .    
e0c0: 20 20 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 77    ** only once w
e0d0: 68 65 72 65 20 74 68 65 72 65 20 65 78 69 73 74  here there exist
e0e0: 20 64 75 70 6c 69 63 61 74 65 20 70 72 65 66 69   duplicate prefi
e0f0: 78 65 73 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  xes).  */.      
e100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70  for(i=0; i<nSamp
e110: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
e120: 20 20 69 66 28 20 69 3d 3d 28 70 49 64 78 2d 3e    if( i==(pIdx->
e130: 6e 53 61 6d 70 6c 65 2d 31 29 0a 20 20 20 20 20  nSample-1).     
e140: 20 20 20 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69      || aSample[i
e150: 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d 61  ].anDLt[iCol]!=a
e160: 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44 4c  Sample[i+1].anDL
e170: 74 5b 69 43 6f 6c 5d 20 0a 20 20 20 20 20 20 20  t[iCol] .       
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 75   ){.          su
e190: 6d 45 71 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69  mEq += aSample[i
e1a0: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
e1b0: 20 20 20 20 20 20 20 20 6e 53 75 6d 31 30 30 20          nSum100 
e1c0: 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20  += 100;.        
e1d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e1e0: 20 69 66 28 20 6e 44 69 73 74 31 30 30 3e 6e 53   if( nDist100>nS
e1f0: 75 6d 31 30 30 20 26 26 20 73 75 6d 45 71 3c 6e  um100 && sumEq<n
e200: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Row ){.        a
e210: 76 67 45 71 20 3d 20 28 28 69 36 34 29 31 30 30  vgEq = ((i64)100
e220: 20 2a 20 28 6e 52 6f 77 20 2d 20 73 75 6d 45 71   * (nRow - sumEq
e230: 29 29 2f 28 6e 44 69 73 74 31 30 30 20 2d 20 6e  ))/(nDist100 - n
e240: 53 75 6d 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  Sum100);.      }
e250: 0a 20 20 20 20 20 20 69 66 28 20 61 76 67 45 71  .      if( avgEq
e260: 3d 3d 30 20 29 20 61 76 67 45 71 20 3d 20 31 3b  ==0 ) avgEq = 1;
e270: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41 76  .      pIdx->aAv
e280: 67 45 71 5b 69 43 6f 6c 5d 20 3d 20 61 76 67 45  gEq[iCol] = avgE
e290: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
e2a0: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20 61 6e  /*.** Look up an
e2b0: 20 69 6e 64 65 78 20 62 79 20 6e 61 6d 65 2e 20   index by name. 
e2c0: 20 4f 72 2c 20 69 66 20 74 68 65 20 6e 61 6d 65   Or, if the name
e2d0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
e2e0: 57 49 44 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  WID table.** is 
e2f0: 73 75 70 70 6c 69 65 64 20 69 6e 73 74 65 61 64  supplied instead
e300: 2c 20 66 69 6e 64 20 74 68 65 20 50 52 49 4d 41  , find the PRIMA
e310: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
e320: 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a   that table..*/.
e330: 73 74 61 74 69 63 20 49 6e 64 65 78 20 2a 66 69  static Index *fi
e340: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
e350: 4b 65 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Key(.  sqlite3 *
e360: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e370: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74   *zName,.  const
e380: 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20   char *zDb.){.  
e390: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
e3a0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
e3b0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
e3c0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
e3d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e3e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
e3f0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  ble(db, zName, z
e400: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
e410: 62 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70  b && !HasRowid(p
e420: 54 61 62 29 20 29 20 70 49 64 78 20 3d 20 73 71  Tab) ) pIdx = sq
e430: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e440: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a  ndex(pTab);.  }.
e450: 20 20 72 65 74 75 72 6e 20 70 49 64 78 3b 0a 7d    return pIdx;.}
e460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
e470: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69   content from ei
e480: 74 68 65 72 20 74 68 65 20 73 71 6c 69 74 65 5f  ther the sqlite_
e490: 73 74 61 74 34 20 6f 72 20 73 71 6c 69 74 65 5f  stat4 or sqlite_
e4a0: 73 74 61 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20  stat3 table .** 
e4b0: 69 6e 74 6f 20 74 68 65 20 72 65 6c 65 76 61 6e  into the relevan
e4c0: 74 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  t Index.aSample[
e4d0: 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20  ] arrays..**.** 
e4e0: 41 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20  Arguments zSql1 
e4f0: 61 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74 20 70  and zSql2 must p
e500: 6f 69 6e 74 20 74 6f 20 53 51 4c 20 73 74 61 74  oint to SQL stat
e510: 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65 74 75  ements that retu
e520: 72 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75 69 76  rn.** data equiv
e530: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c  alent to the fol
e540: 6c 6f 77 69 6e 67 20 28 73 74 61 74 65 6d 65 6e  lowing (statemen
e550: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
e560: 20 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73   for stat3,.** s
e570: 65 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  ee the caller of
e580: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
e590: 6f 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a  or details):.**.
e5a0: 2a 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c  **    zSql1: SEL
e5b0: 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29  ECT idx,count(*)
e5c0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
e5d0: 73 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69  stat4 GROUP BY i
e5e0: 64 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20  dx.**    zSql2: 
e5f0: 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e  SELECT idx,neq,n
e600: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46  lt,ndlt,sample F
e610: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
e620: 61 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  at4.**.** where 
e630: 25 51 20 69 73 20 72 65 70 6c 61 63 65 64 20 77  %Q is replaced w
e640: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
e650: 20 6e 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65   name before the
e660: 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64   SQL is executed
e670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e680: 6c 6f 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73  loadStatTbl(.  s
e690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
e6c0: 2a 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 33 2c  */.  int bStat3,
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e     /* Assume sin
e6f0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72  gle column recor
e700: 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e  ds only */.  con
e710: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20  st char *zSql1, 
e720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
e730: 4c 20 73 74 61 74 65 6d 65 6e 74 20 31 20 28 73  L statement 1 (s
e740: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63  ee above) */.  c
e750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
e760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e770: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 32 20  SQL statement 2 
e780: 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20  (see above) */. 
e790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
e7c0: 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f  (e.g. "main") */
e7d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
e800: 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  des from subrout
e810: 69 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ines */.  sqlite
e820: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
e830: 30 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51  0;      /* An SQ
e840: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  L statement bein
e850: 67 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20  g run */.  char 
e860: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
e870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
e880: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
e890: 65 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ement */.  Index
e8a0: 20 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20   *pPrevIdx = 0; 
e8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
e8c0: 69 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68  ious index in th
e8d0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65  e loop */.  Inde
e8e0: 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65  xSample *pSample
e8f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  ;         /* A s
e900: 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61 53 61  lot in pIdx->aSa
e910: 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  mple[] */..  ass
e920: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
e930: 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
e940: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d   zSql = sqlite3M
e950: 50 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31  Printf(db, zSql1
e960: 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a  , zDb);.  if( !z
e970: 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Sql ){.    retur
e980: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
e990: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
e9a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
e9b0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
e9c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
e9d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
e9e0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
e9f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
ea00: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
ea10: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
ea20: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
ea30: 6e 49 64 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20  nIdxCol = 1;    
ea40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ea50: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ea60: 6e 20 73 74 61 74 34 20 72 65 63 6f 72 64 73 20  n stat4 records 
ea70: 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  */..    char *zI
ea80: 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ndex;   /* Index
ea90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
eaa0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20  ex *pIdx;    /* 
eab0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  Pointer to the i
eac0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
ead0: 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20     int nSample; 
eae0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eaf0: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 69  samples */.    i
eb00: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 2f  nt nByte;      /
eb10: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
eb20: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
eb30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
eb40: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
eb50: 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  ce required */. 
eb60: 20 20 20 74 52 6f 77 63 6e 74 20 2a 70 53 70 61     tRowcnt *pSpa
eb70: 63 65 3b 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20  ce;..    zIndex 
eb80: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
eb90: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
eba0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
ebb0: 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e   zIndex==0 ) con
ebc0: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70  tinue;.    nSamp
ebd0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  le = sqlite3_col
ebe0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
ebf0: 29 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  );.    pIdx = fi
ec00: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
ec10: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
ec20: 7a 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zDb);.    assert
ec30: 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74  ( pIdx==0 || bSt
ec40: 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61  at3 || pIdx->nSa
ec50: 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  mple==0 );.    /
ec60: 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20  * Index.nSample 
ec70: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74  is non-zero at t
ec80: 68 69 73 20 70 6f 69 6e 74 20 69 66 20 64 61 74  his point if dat
ec90: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
eca0: 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64  en.    ** loaded
ecb0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 34 20   from the stat4 
ecc0: 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  table. In this c
ecd0: 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33  ase ignore stat3
ece0: 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69   data.  */.    i
ecf0: 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49  f( pIdx==0 || pI
ed00: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f  dx->nSample ) co
ed10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ed20: 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20  bStat3==0 ){.   
ed30: 20 20 20 61 73 73 65 72 74 28 20 21 48 61 73 52     assert( !HasR
ed40: 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
ed50: 65 29 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c  e) || pIdx->nCol
ed60: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn==pIdx->nKeyC
ed70: 6f 6c 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ol+1 );.      if
ed80: 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78  ( !HasRowid(pIdx
ed90: 2d 3e 70 54 61 62 6c 65 29 20 26 26 20 49 73 50  ->pTable) && IsP
eda0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
edb0: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
edc0: 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nIdxCol = pIdx->
edd0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  nKeyCol;.      }
ede0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 49  else{.        nI
edf0: 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43  dxCol = pIdx->nC
ee00: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  olumn;.      }. 
ee10: 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e     }.    pIdx->n
ee20: 53 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78  SampleCol = nIdx
ee30: 43 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  Col;.    nByte =
ee40: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d   sizeof(IndexSam
ee50: 70 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a  ple) * nSample;.
ee60: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a      nByte += siz
ee70: 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e  eof(tRowcnt) * n
ee80: 49 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61  IdxCol * 3 * nSa
ee90: 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20  mple;.    nByte 
eea0: 2b 3d 20 6e 49 64 78 43 6f 6c 20 2a 20 73 69 7a  += nIdxCol * siz
eeb0: 65 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20 20 20  eof(tRowcnt);   
eec0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 49    /* Space for I
eed0: 6e 64 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f  ndex.aAvgEq[] */
eee0: 0a 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d  ..    pIdx->aSam
eef0: 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ple = sqlite3DbM
ef00: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ef10: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  yte);.    if( pI
ef20: 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29  dx->aSample==0 )
ef30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ef40: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
ef50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ef60: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ef70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 70 61 63  .    }.    pSpac
ef80: 65 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70  e = (tRowcnt*)&p
ef90: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6e 53 61  Idx->aSample[nSa
efa0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 49 64 78 2d  mple];.    pIdx-
efb0: 3e 61 41 76 67 45 71 20 3d 20 70 53 70 61 63 65  >aAvgEq = pSpace
efc0: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
efd0: 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Col;.    for(i=0
efe0: 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  ; i<nSample; i++
eff0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
f000: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d  Sample[i].anEq =
f010: 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20   pSpace; pSpace 
f020: 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20  += nIdxCol;.    
f030: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b    pIdx->aSample[
f040: 69 5d 2e 61 6e 4c 74 20 3d 20 70 53 70 61 63 65  i].anLt = pSpace
f050: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
f060: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  Col;.      pIdx-
f070: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c  >aSample[i].anDL
f080: 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61  t = pSpace; pSpa
f090: 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20  ce += nIdxCol;. 
f0a0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
f0b0: 20 28 28 75 38 2a 29 70 53 70 61 63 65 29 2d 6e   ((u8*)pSpace)-n
f0c0: 42 79 74 65 3d 3d 28 75 38 2a 29 28 70 49 64 78  Byte==(u8*)(pIdx
f0d0: 2d 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a 20 20  ->aSample) );.  
f0e0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f0f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
f100: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
f110: 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  urn rc;..  zSql 
f120: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f130: 28 64 62 2c 20 7a 53 71 6c 32 2c 20 7a 44 62 29  (db, zSql2, zDb)
f140: 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b  ;.  if( !zSql ){
f150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f160: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f170: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f180: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
f190: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
f1a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
f1b0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
f1c0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
f1d0: 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73   rc;..  while( s
f1e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
f1f0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
f200: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  {.    char *zInd
f210: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
f220: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d      /* Index nam
f230: 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  e */.    Index *
f240: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
f250: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f260: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  r to the index o
f270: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
f280: 20 6e 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20   nCol = 1;      
f290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f2a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f2b0: 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20  in index */..   
f2c0: 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20   zIndex = (char 
f2d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
f2e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
f2f0: 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d  .    if( zIndex=
f300: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
f310: 20 20 20 70 49 64 78 20 3d 20 66 69 6e 64 49 6e     pIdx = findIn
f320: 64 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28  dexOrPrimaryKey(
f330: 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29  db, zIndex, zDb)
f340: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  ;.    if( pIdx==
f350: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
f360: 20 20 2f 2a 20 54 68 69 73 20 6e 65 78 74 20 63    /* This next c
f370: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
f380: 20 69 66 20 64 61 74 61 20 68 61 73 20 61 6c 72   if data has alr
f390: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f3a0: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
f3b0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74  e sqlite_stat4 t
f3c0: 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
f3d0: 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20  se ignore stat3 
f3e0: 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 6e 43  data.  */.    nC
f3f0: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ol = pIdx->nSamp
f400: 6c 65 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 62  leCol;.    if( b
f410: 53 74 61 74 33 20 26 26 20 6e 43 6f 6c 3e 31 20  Stat3 && nCol>1 
f420: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f430: 69 66 28 20 70 49 64 78 21 3d 70 50 72 65 76 49  if( pIdx!=pPrevI
f440: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 69 74  dx ){.      init
f450: 41 76 67 45 71 28 70 50 72 65 76 49 64 78 29 3b  AvgEq(pPrevIdx);
f460: 0a 20 20 20 20 20 20 70 50 72 65 76 49 64 78 20  .      pPrevIdx 
f470: 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20  = pIdx;.    }.  
f480: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 49 64    pSample = &pId
f490: 78 2d 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d  x->aSample[pIdx-
f4a0: 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64  >nSample];.    d
f4b0: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f4c0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f4d0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
f4e0: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f4f0: 61 6e 45 71 2c 30 2c 30 29 3b 0a 20 20 20 20 64  anEq,0,0);.    d
f500: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f510: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f520: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
f530: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f540: 61 6e 4c 74 2c 30 2c 30 29 3b 0a 20 20 20 20 64  anLt,0,0);.    d
f550: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f560: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f570: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33  umn_text(pStmt,3
f580: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f590: 61 6e 44 4c 74 2c 30 2c 30 29 3b 0a 0a 20 20 20  anDLt,0,0);..   
f5a0: 20 2f 2a 20 54 61 6b 65 20 61 20 63 6f 70 79 20   /* Take a copy 
f5b0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 41  of the sample. A
f5c0: 64 64 20 74 77 6f 20 30 78 30 30 20 62 79 74 65  dd two 0x00 byte
f5d0: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  s the end of the
f5e0: 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20   buffer..    ** 
f5f0: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
f600: 74 68 65 20 73 61 6d 70 6c 65 20 72 65 63 6f 72  the sample recor
f610: 64 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  d is corrupted. 
f620: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
f630: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
f640: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
f650: 65 28 29 20 6d 61 79 20 72 65 61 64 20 75 70 20  e() may read up 
f660: 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
f670: 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  ast the.    ** e
f680: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
f690: 74 65 64 20 62 75 66 66 65 72 20 62 65 66 6f 72  ted buffer befor
f6a0: 65 20 69 74 20 72 65 61 6c 69 7a 65 73 20 69 74  e it realizes it
f6b0: 20 69 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68   is dealing with
f6c0: 0a 20 20 20 20 2a 2a 20 61 20 63 6f 72 72 75 70  .    ** a corrup
f6d0: 74 20 72 65 63 6f 72 64 2e 20 41 64 64 69 6e 67  t record. Adding
f6e0: 20 74 68 65 20 74 77 6f 20 30 78 30 30 20 62 79   the two 0x00 by
f6f0: 74 65 73 20 70 72 65 76 65 6e 74 73 20 74 68 69  tes prevents thi
f700: 73 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20  s from causing. 
f710: 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
f720: 76 65 72 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20  verread.  */.   
f730: 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71   pSample->n = sq
f740: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
f750: 65 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20  es(pStmt, 4);.  
f760: 20 20 70 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73    pSample->p = s
f770: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f780: 72 6f 28 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e  ro(db, pSample->
f790: 6e 20 2b 20 32 29 3b 0a 20 20 20 20 69 66 28 20  n + 2);.    if( 
f7a0: 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b  pSample->p==0 ){
f7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
f7c0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
f7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f7e0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
f800: 61 6d 70 6c 65 2d 3e 6e 20 29 7b 0a 20 20 20 20  ample->n ){.    
f810: 20 20 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c 65    memcpy(pSample
f820: 2d 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ->p, sqlite3_col
f830: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
f840: 34 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b  4), pSample->n);
f850: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d  .    }.    pIdx-
f860: 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a  >nSample++;.  }.
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
f880: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
f890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f8a0: 5f 4f 4b 20 29 20 69 6e 69 74 41 76 67 45 71 28  _OK ) initAvgEq(
f8b0: 70 50 72 65 76 49 64 78 29 3b 0a 20 20 72 65 74  pPrevIdx);.  ret
f8c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f8d0: 20 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72   Load content fr
f8e0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
f8f0: 61 74 34 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  at4 and sqlite_s
f900: 74 61 74 33 20 74 61 62 6c 65 73 20 69 6e 74 6f  tat3 tables into
f910: 20 0a 2a 2a 20 74 68 65 20 49 6e 64 65 78 2e 61   .** the Index.a
f920: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 20  Sample[] arrays 
f930: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a  of all indices..
f940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
f950: 61 64 53 74 61 74 34 28 73 71 6c 69 74 65 33 20  adStat4(sqlite3 
f960: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
f970: 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  *zDb){.  int rc 
f980: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
f9a0: 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75  lt codes from su
f9b0: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20  broutines */..  
f9c0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
f9d0: 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29  aside.bDisable )
f9e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
f9f0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
fa00: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 7a 44 62  lite_stat4", zDb
fa10: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  ) ){.    rc = lo
fa20: 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20 30 2c  adStatTbl(db, 0,
fa30: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fa40: 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  dx,count(*) FROM
fa50: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
fa60: 20 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20   GROUP BY idx", 
fa70: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fa80: 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c  dx,neq,nlt,ndlt,
fa90: 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73  sample FROM %Q.s
faa0: 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a 20 20  qlite_stat4",.  
fab0: 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20      zDb.    );. 
fac0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
fad0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
fae0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
faf0: 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20  "sqlite_stat3", 
fb00: 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  zDb) ){.    rc =
fb10: 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c   loadStatTbl(db,
fb20: 20 31 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43   1,.      "SELEC
fb30: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
fb40: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
fb50: 61 74 33 20 47 52 4f 55 50 20 42 59 20 69 64 78  at3 GROUP BY idx
fb60: 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ", .      "SELEC
fb70: 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64  T idx,neq,nlt,nd
fb80: 6c 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f 72 64  lt,sqlite_record
fb90: 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51  (sample) FROM %Q
fba0: 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a  .sqlite_stat3",.
fbb0: 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b        zDb.    );
fbc0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fbd0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
fbe0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
fbf0: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
fc00: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63  /*.** Load the c
fc10: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71  ontent of the sq
fc20: 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
fc30: 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61  qlite_stat3/4 ta
fc40: 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e  bles. The.** con
fc50: 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f  tents of sqlite_
fc60: 73 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74  stat1 are used t
fc70: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49  o populate the I
fc80: 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a  ndex.aiRowEst[].
fc90: 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63  ** arrays. The c
fca0: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
fcb0: 65 5f 73 74 61 74 33 2f 34 20 61 72 65 20 75 73  e_stat3/4 are us
fcc0: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
fcd0: 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d  he.** Index.aSam
fce0: 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a  ple[] arrays..**
fcf0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74  .** If the sqlit
fd00: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73  e_stat1 table is
fd10: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
fd20: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51  the database, SQ
fd30: 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73  LITE_ERROR.** is
fd40: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
fd50: 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66  is case, even if
fd60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
fd70: 54 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e  TAT3/4 was defin
fd80: 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f  ed .** during co
fd90: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
fda0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34  e sqlite_stat3/4
fdb0: 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e   table is presen
fdc0: 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a  t, no data is .*
fdd0: 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a  * read from it..
fde0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
fdf0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77  ENABLE_STAT3/4 w
fe00: 61 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e  as defined durin
fe10: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
fe20: 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  d the .** sqlite
fe30: 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20  _stat4 table is 
fe40: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
fe50: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
fe60: 49 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  ITE_ERROR is.** 
fe70: 72 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65  returned. Howeve
fe80: 72 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  r, in this case,
fe90: 20 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72   data is read fr
fea0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
feb0: 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66  at1.** table (if
fec0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20   it is present) 
fed0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
fee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
fef0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
ff00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  this function al
ff10: 77 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61  ways sets db->ma
ff20: 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54  llocFailed..** T
ff30: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
ff40: 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
ff50: 20 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65   care about othe
ff60: 72 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65  r errors, the re
ff70: 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79  turn.** code may
ff80: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   be ignored..*/.
ff90: 69 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  int sqlite3Analy
ffa0: 73 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20  sisLoad(sqlite3 
ffb0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
ffc0: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49   analysisInfo sI
ffd0: 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  nfo;.  HashElem 
ffe0: 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  *i;.  char *zSql
fff0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10000 49 54 45 5f 4f 4b 3b 0a 20 20 53 63 68 65 6d 61  ITE_OK;.  Schema
10010 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
10020 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
10030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
10040 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
10050 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
10060 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
10070 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  !=0 );..  /* Cle
10080 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61  ar any prior sta
10090 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73 73  tistics */.  ass
100a0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
100b0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
100c0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72  iDb, 0) );.  for
100d0 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
100e0 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
100f0 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
10100 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
10110 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
10120 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
10130 28 69 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  (i);.    pTab->t
10140 61 62 46 6c 61 67 73 20 26 3d 20 7e 54 46 5f 48  abFlags &= ~TF_H
10150 61 73 53 74 61 74 31 3b 0a 20 20 7d 0a 20 20 66  asStat1;.  }.  f
10160 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
10170 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69  irst(&pSchema->i
10180 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  dxHash); i; i=sq
10190 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
101a0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
101b0 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
101c0 74 61 28 69 29 3b 0a 20 20 20 20 70 49 64 78 2d  ta(i);.    pIdx-
101d0 3e 68 61 73 53 74 61 74 31 20 3d 20 30 3b 0a 23  >hasStat1 = 0;.#
101e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
101f0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
10200 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  T4.    sqlite3De
10210 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
10220 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
10230 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20  pIdx->aSample = 
10240 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  0;.#endif.  }.. 
10250 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
10260 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
10270 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
10280 74 61 62 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f  table */.  sInfo
10290 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66  .db = db;.  sInf
102a0 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62  o.zDatabase = db
102b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
102c0 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ame;.  if( sqlit
102d0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
102e0 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20  "sqlite_stat1", 
102f0 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
10300 21 3d 30 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  !=0 ){.    zSql 
10310 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10320 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 53  (db, .        "S
10330 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74  ELECT tbl,idx,st
10340 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
10350 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
10360 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
10370 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
10380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10390 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
103a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
103b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
103c0 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73  db, zSql, analys
103d0 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f  isLoader, &sInfo
103e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
103f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
10400 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ql);.    }.  }..
10410 20 20 2f 2a 20 53 65 74 20 61 70 70 72 6f 70 72    /* Set appropr
10420 69 61 74 65 20 64 65 66 61 75 6c 74 73 20 6f 6e  iate defaults on
10430 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 6e 6f 74   all indexes not
10440 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73   in the sqlite_s
10450 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
10460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
10470 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
10480 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
10490 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
104a0 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
104b0 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  idxHash); i; i=s
104c0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
104d0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
104e0 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
104f0 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
10500 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
10510 29 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  ) sqlite3Default
10520 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20  RowEst(pIdx);.  
10530 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  }..  /* Load the
10540 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
10550 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
10560 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  4 table. */.#ifd
10570 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10580 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
10590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
105a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c  _OK ){.    db->l
105b0 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
105c0 65 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  e++;.    rc = lo
105d0 61 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66  adStat4(db, sInf
105e0 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
105f0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
10600 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 0a  bDisable--;.  }.
10610 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
10620 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
10630 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69  ->idxHash); i; i
10640 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
10650 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
10660 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
10670 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71  hData(i);.    sq
10680 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 2d  lite3_free(pIdx-
10690 3e 61 69 52 6f 77 45 73 74 29 3b 0a 20 20 20 20  >aiRowEst);.    
106a0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  pIdx->aiRowEst =
106b0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   0;.  }.#endif..
106c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
106d0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
106e0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
106f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10700 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f  rc;.}...#endif /
10710 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  * SQLITE_OMIT_AN
10720 41 4c 59 5a 45 20 2a 2f 0a                       ALYZE */.