/ Hex Artifact Content
Login

Artifact 1f1af7b08ae033e93e290a5db828772c52f1a8219ed6ff90d35e6d1410b5b6d4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
26e0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
26f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
2700: 2e 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a  .%s(%s)", pDb->z
2710: 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61  DbSName, zTab, a
2720: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20  Table[i].zCols. 
2730: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2740: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
2750: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
2760: 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c        aCreateTbl
2770: 5b 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49  [i] = OPFLAG_P2I
2780: 53 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SREG;.      }.  
2790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
27b0: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
27c0: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
27d0: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
27e0: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
27f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2800: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2810: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
2820: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
2830: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
2840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2850: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
2860: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
2870: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43  ->tnum;.      aC
2880: 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b  reateTbl[i] = 0;
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
28a0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
28b0: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
28c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
28d0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
28f0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2900: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
2920: 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
2930: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
2940: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65  Name, zTab, zWhe
2950: 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20  reType, zWhere. 
2960: 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
2980: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
2990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62      }else if( db
29a0: 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
29b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
29c0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
29d0: 73 65 28 70 50 61 72 73 65 2c 20 22 44 45 4c 45  se(pParse, "DELE
29e0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 22 2c 20  TE FROM %Q.%s", 
29f0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2a00: 54 61 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Tab);.#endif.   
2a10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a20: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f    /* The sqlite_
2a30: 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 20  stat[134] table 
2a40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
2a50: 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73   Delete all rows
2a60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a80: 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f  , OP_Clear, aRoo
2a90: 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20  t[i], iDb);.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c   /* Open the sql
2ac0: 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61  ite_stat[134] ta
2ad0: 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69 6e 67  bles for writing
2ae0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
2af0: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b  aTable[i].zCols;
2b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2b10: 74 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  t( i<ArraySize(a
2b20: 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 73 71  Table) );.    sq
2b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2b40: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
2b50: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
2b60: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33  aRoot[i], iDb, 3
2b70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b80: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 43  beChangeP5(v, aC
2b90: 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20  reateTbl[i]);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d  , aTable[i].zNam
2bc0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e));.  }.}../*.*
2bd0: 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75  * Recommended nu
2be0: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
2bf0: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 34  for sqlite_stat4
2c00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2c10: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
2c20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
2c30: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 32  _STAT4_SAMPLES 2
2c40: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
2c50: 54 68 72 65 65 20 53 51 4c 20 66 75 6e 63 74 69  Three SQL functi
2c60: 6f 6e 73 20 2d 20 73 74 61 74 5f 69 6e 69 74 28  ons - stat_init(
2c70: 29 2c 20 73 74 61 74 5f 70 75 73 68 28 29 2c 20  ), stat_push(), 
2c80: 61 6e 64 20 73 74 61 74 5f 67 65 74 28 29 20 2d  and stat_get() -
2c90: 0a 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73  .** share an ins
2ca0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2cb0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2cc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73   to hold their s
2cd0: 74 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  tate.** informat
2ce0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2cf0: 73 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75  struct Stat4Accu
2d00: 6d 20 53 74 61 74 34 41 63 63 75 6d 3b 0a 74 79  m Stat4Accum;.ty
2d10: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2d20: 74 34 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61  t4Sample Stat4Sa
2d30: 6d 70 6c 65 3b 0a 73 74 72 75 63 74 20 53 74 61  mple;.struct Sta
2d40: 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f  t4Sample {.  tRo
2d50: 77 63 6e 74 20 2a 61 6e 45 71 3b 20 20 20 20 20  wcnt *anEq;     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d70: 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71  sqlite_stat4.nEq
2d80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
2d90: 6e 44 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20  nDLt;           
2da0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f        /* sqlite_
2db0: 73 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69  stat4.nDLt */.#i
2dc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2dd0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
2de0: 34 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c  4.  tRowcnt *anL
2df0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e00: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
2e10: 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69  at4.nLt */.  uni
2e20: 6f 6e 20 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  on {.    i64 iRo
2e30: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e50: 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20  d in main table 
2e60: 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  of the key */.  
2e70: 20 20 75 38 20 2a 61 52 6f 77 69 64 3b 20 20 20    u8 *aRowid;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20 57 49 54    /* Key for WIT
2ea0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2eb0: 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33  s */.  } u;.  u3
2ec0: 32 20 6e 52 6f 77 69 64 3b 20 20 20 20 20 20 20  2 nRowid;       
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 53 69 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d   Sizeof aRowid[]
2ef0: 20 2a 2f 0a 20 20 75 38 20 69 73 50 53 61 6d 70   */.  u8 isPSamp
2f00: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2f10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f20: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2f30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  le */.  int iCol
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21 69          /* If !i
2f60: 73 50 53 61 6d 70 6c 65 2c 20 74 68 65 20 72 65  sPSample, the re
2f70: 61 73 6f 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69  ason for inclusi
2f80: 6f 6e 20 2a 2f 0a 20 20 75 33 32 20 69 48 61 73  on */.  u32 iHas
2f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72          /* Tiebr
2fb0: 65 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 23 65  eaker hash */.#e
2fc0: 6e 64 69 66 0a 7d 3b 20 20 20 20 20 20 20 20 20  ndif.};         
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 0a 73 74 72 75             .stru
3000: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a  ct Stat4Accum {.
3010: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3030: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
3040: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
3050: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
3060: 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  PSample;        
3070: 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f   /* How often to
3080: 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73   do a periodic s
3090: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ample */.  int n
30a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
30b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
30d0: 65 78 20 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f  ex + pk/rowid */
30e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
3110: 63 6f 6c 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20  columns w/o the 
3120: 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  pk/rowid */.  in
3130: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3150: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  um number of sam
3160: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
3170: 74 65 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d  te */.  Stat4Sam
3180: 70 6c 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20  ple current;    
3190: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
31a0: 20 61 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c   as a Stat4Sampl
31b0: 65 20 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b  e */.  u32 iPrn;
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f   /* Pseudo-rando
31e0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
31f0: 72 20 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20  r sampling */.  
3200: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65  Stat4Sample *aBe
3210: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  st;       /* Arr
3220: 61 79 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20  ay of nCol best 
3230: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  samples */.  int
3240: 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   iMin;          
3250: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3260: 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20  in a[] of entry 
3270: 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f  with minimum sco
3280: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d  re */.  int nSam
3290: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
32a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
32b0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
32c0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65  /.  int nMaxEqZe
32d0: 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ro;           /*
32e0: 20 4d 61 78 20 6c 65 61 64 69 6e 67 20 30 20 69   Max leading 0 i
32f0: 6e 20 61 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79  n anEq[] for any
3300: 20 61 5b 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20   a[] entry */.  
3310: 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20 20 20  int iGet;       
3320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3330: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 73 61  ex of current sa
3340: 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20 62 79  mple accessed by
3350: 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20   stat_get() */. 
3360: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b   Stat4Sample *a;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3380: 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20  ray of mxSample 
3390: 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65  Stat4Sample obje
33a0: 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  cts */.  sqlite3
33b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
33d0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d  onnection, for m
33e0: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  alloc() */.};../
33f0: 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  * Reclaim memory
3400: 20 75 73 65 64 20 62 79 20 61 20 53 74 61 74 34   used by a Stat4
3410: 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66  Sample.*/.#ifdef
3420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3430: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3440: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3450: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
3460: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3470: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  p){.  assert( db
3480: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3490: 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71  nRowid ){.    sq
34a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
34b0: 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20  p->u.aRowid);.  
34c0: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b    p->nRowid = 0;
34d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
34e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
34f0: 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66 20 61   BLOB value of a
3500: 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66   ROWID.*/.#ifdef
3510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3520: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3530: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3540: 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33  SetRowid(sqlite3
3550: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3560: 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  e *p, int n, con
3570: 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b 0a 20  st u8 *pData){. 
3580: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69  ;.  if( p->nRowi
35a0: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
35b0: 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69  e(db, p->u.aRowi
35c0: 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69  d);.  p->u.aRowi
35d0: 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  d = sqlite3DbMal
35e0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b  locRawNN(db, n);
35f0: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3600: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
3610: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
3620: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
3630: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
3640: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
3650: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
3660: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3670: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3680: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3690: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
36a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
36b0: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
36c0: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
36d0: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
36e0: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
36f0: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3700: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
3710: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3720: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
3730: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
3740: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
3750: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
3760: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3780: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3790: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
37a0: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
37b0: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
37c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
37e0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
37f0: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3800: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
3810: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
3820: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
3830: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
3840: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
3850: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
3860: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3870: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3880: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3890: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
38a0: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
38b0: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
38c0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
38d0: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
38e0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
38f0: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3900: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
3910: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
3920: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3930: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
3940: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
3950: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
3960: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3970: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3980: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
39a0: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
39b0: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
39c0: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
39d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
39e0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
39f0: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3a00: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
3a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3a20: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
3a30: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
3a40: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
3a50: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
3a60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3a70: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3a80: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3aa0: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3ab0: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3ac0: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3ad0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3ae0: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3af0: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3b00: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
3b10: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
3b20: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3b40: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
3b50: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3b60: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3b70: 74 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e  t(N,K,C) SQL fun
3b80: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
3b90: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3ba0: 72 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20  re:.**     N:   
3bb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3bc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3bd0: 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  dex including th
3be0: 65 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65  e rowid/pk (note
3bf0: 20 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20   1).**     K:   
3c00: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3c10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3c20: 64 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68  dex excluding th
3c30: 65 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20  e rowid/pk..**  
3c40: 20 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d     C:    The num
3c50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
3c60: 68 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32  he index (note 2
3c70: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20  ).**.** Note 1: 
3c80: 20 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20   In the special 
3c90: 63 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65  case of the cove
3ca0: 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ring index that 
3cb0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20  implements a.** 
3cc0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3cd0: 62 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75  ble, N is the nu
3ce0: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
3cf0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74  KEY columns, not
3d00: 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
3d10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3d20: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
3d30: 0a 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69  .** Note 2:  C i
3d40: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
3d50: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 2e  STAT3 and STAT4.
3d60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
3d70: 65 73 20 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72  es on ordinary r
3d80: 6f 77 69 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d  owid tables, N==
3d90: 4b 2b 31 2e 20 20 42 75 74 20 66 6f 72 20 69 6e  K+1.  But for in
3da0: 64 65 78 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48  dexes on.** WITH
3db0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
3dc0: 2c 20 4e 3d 4b 2b 50 20 77 68 65 72 65 20 50 20  , N=K+P where P 
3dd0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3de0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
3df0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
3e00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
3e10: 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
3e20: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
3e40: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
3e50: 61 62 6c 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20  able as N==K as 
3e60: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 0a  a special case..
3e70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3e80: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  ne allocates the
3e90: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
3ea0: 63 74 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72  ct in heap memor
3eb0: 79 2e 20 54 68 65 20 72 65 74 75 72 6e 20 0a 2a  y. The return .*
3ec0: 2a 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  * value is a poi
3ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
3ee0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20  4Accum object.  
3ef0: 54 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  The datatype of 
3f00: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
3f10: 6c 75 65 20 69 73 20 42 4c 4f 42 2c 20 62 75 74  lue is BLOB, but
3f20: 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   it is really ju
3f30: 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  st a pointer to 
3f40: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 0a 2a  the Stat4Accum.*
3f50: 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  * object..*/.sta
3f60: 74 69 63 20 76 6f 69 64 20 73 74 61 74 49 6e 69  tic void statIni
3f70: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t(.  sqlite3_con
3f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
3fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3fb0: 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75  v.){.  Stat4Accu
3fc0: 6d 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  m *p;.  int nCol
3fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4000: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 61 6d 70  index being samp
4010: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  led */.  int nKe
4020: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4040: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
4050: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55  s */.  int nColU
4060: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4070: 20 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72         /* nCol r
4080: 6f 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c  ounded up for al
4090: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ignment */.  int
40a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
40d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
40e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
4110: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  ection */.#ifdef
4120: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4130: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
4140: 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53  int mxSample = S
4150: 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50  QLITE_STAT4_SAMP
4160: 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  LES;.#endif..  /
4170: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72  * Decode the thr
4180: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
4190: 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45  ments */.  UNUSE
41a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
41b0: 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  );.  nCol = sqli
41c0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
41d0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
41e0: 28 20 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43  ( nCol>0 );.  nC
41f0: 6f 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52  olUp = sizeof(tR
4200: 6f 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c  owcnt)<8 ? (nCol
4210: 2b 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20  +1)&~1 : nCol;. 
4220: 20 6e 4b 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74   nKeyCol = sqlit
4230: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4240: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
4250: 20 6e 4b 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29   nKeyCol<=nCol )
4260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
4270: 43 6f 6c 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  Col>0 );..  /* A
4280: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
4290: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
42a0: 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62  he Stat4Accum ob
42b0: 6a 65 63 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69  ject */.  n = si
42c0: 7a 65 6f 66 28 2a 70 29 20 0a 20 20 20 20 2b 20  zeof(*p) .    + 
42d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
42e0: 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20  nColUp          
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34          /* Stat4
4300: 41 63 63 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20  Accum.anEq */.  
4310: 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63    + sizeof(tRowc
4320: 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20  nt)*nColUp      
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4340: 74 61 74 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20  tat4Accum.anDLt 
4350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4360: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4370: 5f 53 54 41 54 34 0a 20 20 20 20 2b 20 73 69 7a  _STAT4.    + siz
4380: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4390: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
43a0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
43b0: 75 6d 2e 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b  um.anLt */.    +
43c0: 20 73 69 7a 65 6f 66 28 53 74 61 74 34 53 61 6d   sizeof(Stat4Sam
43d0: 70 6c 65 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d  ple)*(nCol+mxSam
43e0: 70 6c 65 29 20 20 20 20 20 2f 2a 20 53 74 61 74  ple)     /* Stat
43f0: 34 41 63 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20  4Accum.aBest[], 
4400: 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a  a[] */.    + siz
4410: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e  eof(tRowcnt)*3*n
4420: 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61  ColUp*(nCol+mxSa
4430: 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b  mple).#endif.  ;
4440: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
4450: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
4460: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20  e(context);.  p 
4470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4480: 63 5a 65 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20  cZero(db, n);.  
4490: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
44a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
44b0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
44c0: 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
44d0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20  .  }..  p->db = 
44e0: 64 62 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20  db;.  p->nRow = 
44f0: 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e  0;.  p->nCol = n
4500: 43 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f  Col;.  p->nKeyCo
4510: 6c 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  l = nKeyCol;.  p
4520: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20  ->current.anDLt 
4530: 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31  = (tRowcnt*)&p[1
4540: 5d 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e  ];.  p->current.
4550: 61 6e 45 71 20 3d 20 26 70 2d 3e 63 75 72 72 65  anEq = &p->curre
4560: 6e 74 2e 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d  nt.anDLt[nColUp]
4570: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4580: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4590: 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 75  _STAT4.  {.    u
45a0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45c0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  * Allocated spac
45d0: 65 20 6e 6f 74 20 79 65 74 20 61 73 73 69 67 6e  e not yet assign
45e0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
4610: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
4620: 6f 75 67 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ough p->aSample[
4630: 5d 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65  ] */..    p->iGe
4640: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d  t = -1;.    p->m
4650: 78 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70  xSample = mxSamp
4660: 6c 65 3b 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d  le;.    p->nPSam
4670: 70 6c 65 20 3d 20 28 74 52 6f 77 63 6e 74 29 28  ple = (tRowcnt)(
4680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4690: 74 36 34 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78  t64(argv[2])/(mx
46a0: 53 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29  Sample/3+1) + 1)
46b0: 3b 0a 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74  ;.    p->current
46c0: 2e 61 6e 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72  .anLt = &p->curr
46d0: 65 6e 74 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d  ent.anEq[nColUp]
46e0: 3b 0a 20 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20  ;.    p->iPrn = 
46f0: 30 78 36 38 39 65 39 36 32 64 2a 28 75 33 32 29  0x689e962d*(u32)
4700: 6e 43 6f 6c 20 5e 20 30 78 64 30 39 34 34 35 36  nCol ^ 0xd094456
4710: 35 2a 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  5*(u32)sqlite3_v
4720: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
4730: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74  );.  .    /* Set
4740: 20 75 70 20 74 68 65 20 53 74 61 74 34 41 63 63   up the Stat4Acc
4750: 75 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74  um.a[] and aBest
4760: 5b 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20  [] arrays */.   
4770: 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20   p->a = (struct 
4780: 53 74 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d  Stat4Sample*)&p-
4790: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43  >current.anLt[nC
47a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42  olUp];.    p->aB
47b0: 65 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61  est = &p->a[mxSa
47c0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63  mple];.    pSpac
47d0: 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b  e = (u8*)(&p->a[
47e0: 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b  mxSample+nCol]);
47f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4800: 28 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b  (mxSample+nCol);
4810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4820: 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f  a[i].anEq = (tRo
4830: 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70  wcnt *)pSpace; p
4840: 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66  Space += (sizeof
4850: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c  (tRowcnt) * nCol
4860: 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  Up);.      p->a[
4870: 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63  i].anLt = (tRowc
4880: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
4890: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
48a0: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70  Rowcnt) * nColUp
48b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  );.      p->a[i]
48c0: 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e  .anDLt = (tRowcn
48d0: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
48e0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
48f0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
4900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4910: 72 74 28 20 28 70 53 70 61 63 65 20 2d 20 28 75  rt( (pSpace - (u
4920: 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20  8*)p)==n );.  . 
4930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4940: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4950: 70 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c  p->aBest[i].iCol
4960: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
4970: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74  #endif..  /* Ret
4980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4990: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f   the allocated o
49a0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c  bject to the cal
49b0: 6c 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  ler.  Note that.
49c0: 20 20 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f    ** only the po
49d0: 69 6e 74 65 72 20 28 74 68 65 20 32 6e 64 20 70  inter (the 2nd p
49e0: 61 72 61 6d 65 74 65 72 29 20 6d 61 74 74 65 72  arameter) matter
49f0: 73 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66 20  s.  The size of 
4a00: 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  the object.  ** 
4a10: 28 67 69 76 65 6e 20 62 79 20 74 68 65 20 33 72  (given by the 3r
4a20: 64 20 70 61 72 61 6d 65 74 65 72 29 20 69 73 20  d parameter) is 
4a30: 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64 20 63  never used and c
4a40: 61 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69  an be any positi
4a50: 76 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a  ve.  ** value. *
4a60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4a70: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4a80: 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20   p, sizeof(*p), 
4a90: 73 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29  stat4Destructor)
4aa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.}.static const
4ab0: 20 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69   FuncDef statIni
4ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32  tFuncdef = {.  2
4ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
4ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
4af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
4b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
4b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
4b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
4b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
4b50: 20 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20    statInit,     
4b60: 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a     /* xSFunc */.
4b70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4b80: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
4b90: 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20  */.  0, 0,      
4ba0: 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c        /* xValue,
4bb0: 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22   xInverse */.  "
4bc0: 73 74 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20  stat_init",     
4bd0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30  /* zName */.  {0
4be0: 7d 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.};..#ifdef SQL
4bf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
4c00: 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20  ./*.** pNew and 
4c10: 70 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61  pOld are both ca
4c20: 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69  ndidate non-peri
4c30: 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c  odic samples sel
4c40: 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68  ected for .** th
4c50: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70  e same column (p
4c60: 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d  New->iCol==pOld-
4c70: 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67  >iCol). Ignoring
4c80: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64   this column and
4c90: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
4ca0: 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69   only any traili
4cb0: 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  ng columns and t
4cc0: 68 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76  he sample hash v
4cd0: 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  alue, this.** fu
4ce0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
4cf0: 72 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e  rue if sample pN
4d00: 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66  ew is to be pref
4d10: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
4d20: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
4d30: 64 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65  ds, if we assume
4d40: 20 74 68 61 74 20 74 68 65 20 63 61 72 64 69 6e   that the cardin
4d50: 61 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20 73  alities of the s
4d60: 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d  elected.** colum
4d70: 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70  n for pNew and p
4d80: 4f 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69  Old are equal, i
4d90: 73 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65  s pNew to be pre
4da0: 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64  ferred over pOld
4db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4dc0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
4dd0: 61 74 20 66 6f 72 20 65 61 63 68 20 61 72 67 75  at for each argu
4de0: 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65  ment sample, the
4df0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
4e00: 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79  the anEq[] array
4e10: 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61   from pSample->a
4e20: 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f  nEq[pSample->iCo
4e30: 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65  l+1] onwards are
4e40: 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74   valid. .*/.stat
4e50: 69 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42  ic int sampleIsB
4e60: 65 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61  etterPost(.  Sta
4e70: 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c  t4Accum *pAccum,
4e80: 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20   .  Stat4Sample 
4e90: 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53  *pNew, .  Stat4S
4ea0: 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20  ample *pOld.){. 
4eb0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63   int nCol = pAcc
4ec0: 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  um->nCol;.  int 
4ed0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  i;.  assert( pNe
4ee0: 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69  w->iCol==pOld->i
4ef0: 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  Col );.  for(i=p
4f00: 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e  New->iCol+1; i<n
4f10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
4f20: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f30: 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  >pOld->anEq[i] )
4f40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4f50: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f60: 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  <pOld->anEq[i] )
4f70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4f80: 20 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68   if( pNew->iHash
4f90: 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72  >pOld->iHash ) r
4fa0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
4fb0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
4fc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4fd0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
4fe0: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
4ff0: 74 72 75 65 20 69 66 20 70 4e 65 77 20 69 73 20  true if pNew is 
5000: 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64 20  to be preferred 
5010: 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a  over pOld..**.**
5020: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5030: 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20  ssumes that for 
5040: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61  each argument sa
5050: 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e  mple, the conten
5060: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45  ts of.** the anE
5070: 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70  q[] array from p
5080: 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61  Sample->anEq[pSa
5090: 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61  mple->iCol] onwa
50a0: 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a  rds are valid. .
50b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
50c0: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20  mpleIsBetter(.  
50d0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63  Stat4Accum *pAcc
50e0: 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70  um, .  Stat4Samp
50f0: 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61  le *pNew, .  Sta
5100: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29  t4Sample *pOld.)
5110: 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e  {.  tRowcnt nEqN
5120: 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b  ew = pNew->anEq[
5130: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74  pNew->iCol];.  t
5140: 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20  Rowcnt nEqOld = 
5150: 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d  pOld->anEq[pOld-
5160: 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  >iCol];..  asser
5170: 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70  t( pOld->isPSamp
5180: 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69  le==0 && pNew->i
5190: 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20  sPSample==0 );. 
51a0: 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34   assert( IsStat4
51b0: 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d   || (pNew->iCol=
51c0: 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c  =0 && pOld->iCol
51d0: 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28  ==0) );..  if( (
51e0: 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29  nEqNew>nEqOld) )
51f0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65   return 1;.#ifde
5200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5210: 53 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e  STAT4.  if( nEqN
5220: 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20  ew==nEqOld ){.  
5230: 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c    if( pNew->iCol
5240: 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65  <pOld->iCol ) re
5250: 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
5260: 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d  rn (pNew->iCol==
5270: 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61  pOld->iCol && sa
5280: 6d 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74  mpleIsBetterPost
5290: 28 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70  (pAccum, pNew, p
52a0: 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Old));.  }.  ret
52b0: 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 0;.#else.  r
52c0: 65 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e  eturn (nEqNew==n
52d0: 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69  EqOld && pNew->i
52e0: 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68  Hash>pOld->iHash
52f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
5300: 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  ** Copy the cont
5310: 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a  ents of sample *
5320: 70 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d  pNew into the p-
5330: 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e  >a[] array. If n
5340: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d  ecessary,.** rem
5350: 6f 76 65 20 74 68 65 20 6c 65 61 73 74 20 64 65  ove the least de
5360: 73 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66  sirable sample f
5370: 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61  rom p->a[] to ma
5380: 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74  ke room..*/.stat
5390: 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e  ic void sampleIn
53a0: 73 65 72 74 28 53 74 61 74 34 41 63 63 75 6d 20  sert(Stat4Accum 
53b0: 2a 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20  *p, Stat4Sample 
53c0: 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65  *pNew, int nEqZe
53d0: 72 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70  ro){.  Stat4Samp
53e0: 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b  le *pSample = 0;
53f0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
5400: 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20  ert( IsStat4 || 
5410: 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23  nEqZero==0 );..#
5420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5430: 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53  BLE_STAT4.  /* S
5440: 74 61 74 34 41 63 63 75 6d 2e 6e 4d 61 78 45 71  tat4Accum.nMaxEq
5450: 5a 65 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  Zero is set to t
5460: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
5470: 72 20 6f 66 20 6c 65 61 64 69 6e 67 20 30 0a 20  r of leading 0. 
5480: 20 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68   ** values in th
5490: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 6f  e anEq[] array o
54a0: 66 20 61 6e 79 20 73 61 6d 70 6c 65 20 69 6e 20  f any sample in 
54b0: 53 74 61 74 34 41 63 63 75 6d 2e 61 5b 5d 2e 20  Stat4Accum.a[]. 
54c0: 49 6e 0a 20 20 2a 2a 20 6f 74 68 65 72 20 77 6f  In.  ** other wo
54d0: 72 64 73 2c 20 69 66 20 6e 4d 61 78 45 71 5a 65  rds, if nMaxEqZe
54e0: 72 6f 20 69 73 20 6e 2c 20 74 68 65 6e 20 69 74  ro is n, then it
54f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
5500: 68 61 74 20 74 68 65 72 65 0a 20 20 2a 2a 20 61  hat there.  ** a
5510: 72 65 20 6e 6f 20 73 61 6d 70 6c 65 73 20 77 69  re no samples wi
5520: 74 68 20 53 74 61 74 34 53 61 6d 70 6c 65 2e 61  th Stat4Sample.a
5530: 6e 45 71 5b 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d  nEq[m]==0 for (m
5540: 3e 3d 6e 29 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  >=n). */.  if( n
5550: 45 71 5a 65 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71  EqZero>p->nMaxEq
5560: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  Zero ){.    p->n
5570: 4d 61 78 45 71 5a 65 72 6f 20 3d 20 6e 45 71 5a  MaxEqZero = nEqZ
5580: 65 72 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ero;.  }.  if( p
5590: 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d  New->isPSample==
55a0: 30 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  0 ){.    Stat4Sa
55b0: 6d 70 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d  mple *pUpgrade =
55c0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
55d0: 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d  pNew->anEq[pNew-
55e0: 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20  >iCol]>0 );..   
55f0: 20 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20   /* This sample 
5600: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 62  is being added b
5610: 65 63 61 75 73 65 20 74 68 65 20 70 72 65 66 69  ecause the prefi
5620: 78 20 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63  x that ends in c
5630: 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43  olumn .    ** iC
5640: 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74  ol occurs many t
5650: 69 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  imes in the tabl
5660: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77  e. However, if w
5670: 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
5680: 20 20 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61     ** added a sa
5690: 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73  mple that shares
56a0: 20 74 68 69 73 20 70 72 65 66 69 78 2c 20 74 68   this prefix, th
56b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
56c0: 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69  o add.    ** thi
56d0: 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20  s one. Instead, 
56e0: 75 70 67 72 61 64 65 20 74 68 65 20 70 72 69 6f  upgrade the prio
56f0: 72 69 74 79 20 6f 66 20 74 68 65 20 68 69 67 68  rity of the high
5700: 65 73 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20  est priority.   
5710: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d   ** existing sam
5720: 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20  ple that shares 
5730: 74 68 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f  this prefix.  */
5740: 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
5750: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
5760: 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34  --){.      Stat4
5770: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26  Sample *pOld = &
5780: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  p->a[i];.      i
5790: 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e  f( pOld->anEq[pN
57a0: 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  ew->iCol]==0 ){.
57b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
57c0: 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65  ->isPSample ) re
57d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
57e0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c  sert( pOld->iCol
57f0: 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20  >pNew->iCol );. 
5800: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5810: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c  ampleIsBetter(p,
5820: 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a   pNew, pOld) );.
5830: 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70 67          if( pUpg
5840: 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c  rade==0 || sampl
5850: 65 49 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c  eIsBetter(p, pOl
5860: 64 2c 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a  d, pUpgrade) ){.
5870: 20 20 20 20 20 20 20 20 20 20 70 55 70 67 72 61            pUpgra
5880: 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  de = pOld;.     
5890: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
58a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70 67 72   }.    if( pUpgr
58b0: 61 64 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70  ade ){.      pUp
58c0: 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e  grade->iCol = pN
58d0: 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20  ew->iCol;.      
58e0: 70 55 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70  pUpgrade->anEq[p
58f0: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d  Upgrade->iCol] =
5900: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67   pNew->anEq[pUpg
5910: 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20  rade->iCol];.   
5920: 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77     goto find_new
5930: 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _min;.    }.  }.
5940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
5950: 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76  necessary, remov
5960: 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f  e sample iMin to
5970: 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
5980: 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a  he new sample. *
5990: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  /.  if( p->nSamp
59a0: 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le>=p->mxSample 
59b0: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
59c0: 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61  le *pMin = &p->a
59d0: 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74  [p->iMin];.    t
59e0: 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70  Rowcnt *anEq = p
59f0: 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74  Min->anEq;.    t
5a00: 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70  Rowcnt *anLt = p
5a10: 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74  Min->anLt;.    t
5a20: 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20  Rowcnt *anDLt = 
5a30: 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20  pMin->anDLt;.   
5a40: 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e   sampleClear(p->
5a50: 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d  db, pMin);.    m
5a60: 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d  emmove(pMin, &pM
5a70: 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d  in[1], sizeof(p-
5a80: 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70  >a[0])*(p->nSamp
5a90: 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a  le-p->iMin-1));.
5aa0: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
5ab0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  ->a[p->nSample-1
5ac0: 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  ];.    pSample->
5ad0: 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  nRowid = 0;.    
5ae0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20  pSample->anEq = 
5af0: 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c  anEq;.    pSampl
5b00: 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74  e->anDLt = anDLt
5b10: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61  ;.    pSample->a
5b20: 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20  nLt = anLt;.    
5b30: 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e  p->nSample = p->
5b40: 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a  mxSample-1;.  }.
5b50: 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20  .  /* The "rows 
5b60: 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74  less-than" for t
5b70: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
5b80: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
5b90: 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66  than that.  ** f
5ba0: 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70  or the last samp
5bb0: 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d  le in the p->a[]
5bc0: 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
5bd0: 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77  e, the samples w
5be0: 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74  ould.  ** be out
5bf0: 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69   of order. */.#i
5c00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5c10: 4c 45 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72  LE_STAT4.  asser
5c20: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30  t( p->nSample==0
5c30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77   .       || pNew
5c40: 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->anLt[p->nCol-1
5c50: 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d  ] > p->a[p->nSam
5c60: 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e  ple-1].anLt[p->n
5c70: 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66  Col-1] );.#endif
5c80: 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
5c90: 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a  e new sample */.
5ca0: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
5cb0: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  a[p->nSample];. 
5cc0: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70   sampleCopy(p, p
5cd0: 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20  Sample, pNew);. 
5ce0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a   p->nSample++;..
5cf0: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
5d00: 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72  rst nEqZero entr
5d10: 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b  ies in the anEq[
5d20: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65  ] array. */.  me
5d30: 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e  mset(pSample->an
5d40: 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52  Eq, 0, sizeof(tR
5d50: 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b  owcnt)*nEqZero);
5d60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d70: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69  ENABLE_STAT4. fi
5d80: 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64  nd_new_min:.#end
5d90: 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  if.  if( p->nSam
5da0: 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65  ple>=p->mxSample
5db0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e   ){.    int iMin
5dc0: 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69   = -1;.    for(i
5dd0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
5de0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
5df0: 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61  f( p->a[i].isPSa
5e00: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
5e10: 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c  .      if( iMin<
5e20: 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  0 || sampleIsBet
5e30: 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69  ter(p, &p->a[iMi
5e40: 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b  n], &p->a[i]) ){
5e50: 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  .        iMin = 
5e60: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
5e70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69  .    assert( iMi
5e80: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  n>=0 );.    p->i
5e90: 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a  Min = iMin;.  }.
5ea0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5eb0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
5ec0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
5ed0: 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f  ** Field iChng o
5ee0: 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
5ef0: 67 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68  g scanned has ch
5f00: 61 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69  anged. So at thi
5f10: 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75  s point.** p->cu
5f20: 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61  rrent contains a
5f30: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66   sample that ref
5f40: 6c 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f  lects the previo
5f50: 75 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a  us row of the.**
5f60: 20 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75   index. The valu
5f70: 65 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d  e of anEq[iChng]
5f80: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
5f90: 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20  anEq[] elements 
5fa0: 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61  are.** correct a
5fb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
5fc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d  .static void sam
5fd0: 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28  plePushPrevious(
5fe0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69  Stat4Accum *p, i
5ff0: 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65  nt iChng){.#ifde
6000: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6010: 53 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a  STAT4.  int i;..
6020: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
6030: 79 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74  y samples from t
6040: 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  he aBest[] array
6050: 20 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65   should be pushe
6060: 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65  d.  ** into Inde
6070: 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74  xSample.a[] at t
6080: 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20  his point.  */. 
6090: 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d   for(i=(p->nCol-
60a0: 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d  2); i>=iChng; i-
60b0: 2d 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d  -){.    Stat4Sam
60c0: 70 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d  ple *pBest = &p-
60d0: 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70  >aBest[i];.    p
60e0: 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20  Best->anEq[i] = 
60f0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6100: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
6110: 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70  Sample<p->mxSamp
6120: 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65  le || sampleIsBe
6130: 74 74 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26  tter(p, pBest, &
6140: 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29  p->a[p->iMin]) )
6150: 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e  {.      sampleIn
6160: 73 65 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69  sert(p, pBest, i
6170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
6180: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6e 6f  /* Check that no
6190: 20 73 61 6d 70 6c 65 20 63 6f 6e 74 61 69 6e 73   sample contains
61a0: 20 61 6e 20 61 6e 45 71 5b 5d 20 65 6e 74 72 79   an anEq[] entry
61b0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f   with an index o
61c0: 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71  f.  ** p->nMaxEq
61d0: 5a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20  Zero or greater 
61e0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a  set to zero. */.
61f0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70    for(i=p->nSamp
6200: 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  le-1; i>=0; i--)
6210: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
6220: 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71   for(j=p->nMaxEq
6230: 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  Zero; j<p->nCol;
6240: 20 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   j++) assert( p-
6250: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20  >a[i].anEq[j]>0 
6260: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
6270: 61 74 65 20 74 68 65 20 61 6e 45 71 5b 5d 20 66  ate the anEq[] f
6280: 69 65 6c 64 73 20 6f 66 20 61 6e 79 20 73 61 6d  ields of any sam
6290: 70 6c 65 73 20 61 6c 72 65 61 64 79 20 63 6f 6c  ples already col
62a0: 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20 69 66 28  lected. */.  if(
62b0: 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71   iChng<p->nMaxEq
62c0: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28  Zero ){.    for(
62d0: 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20  i=p->nSample-1; 
62e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
62f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
6300: 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d  or(j=iChng; j<p-
6310: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
6320: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d       if( p->a[i]
6330: 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d  .anEq[j]==0 ) p-
6340: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20  >a[i].anEq[j] = 
6350: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6360: 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
6370: 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a  }.    p->nMaxEqZ
6380: 65 72 6f 20 3d 20 69 43 68 6e 67 3b 0a 20 20 7d  ero = iChng;.  }
6390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
63a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
63b0: 4c 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65  LE_STAT3) && !de
63c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
63d0: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28  BLE_STAT4).  if(
63e0: 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20   iChng==0 ){.   
63f0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
6400: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30  ->current.anLt[0
6410: 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ];.    tRowcnt n
6420: 45 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Eq = p->current.
6430: 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  anEq[0];..    /*
6440: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
6450: 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64  s to be a period
6460: 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f  ic sample. If so
6470: 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20  , add it. */.   
6480: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
6490: 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71  ample)!=(nLt+nEq
64a0: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
64b0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
64c0: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
64d0: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
64e0: 65 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ert(p, &p->curre
64f0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  nt, 0);.      p-
6500: 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70  >current.isPSamp
6510: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
6520: 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66  e ..    /* Or if
6530: 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72   it is a non-per
6540: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64  iodic sample. Ad
6550: 64 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73  d it in this cas
6560: 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66  e too. */.    if
6570: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
6580: 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c  mxSample .     |
6590: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
65a0: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
65b0: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
65c0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
65d0: 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26  ampleInsert(p, &
65e0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a  p->current, 0);.
65f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6600: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6610: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
6620: 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f  _STAT4.  UNUSED_
6630: 50 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a  PARAMETER( p );.
6640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6650: 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e  ER( iChng );.#en
6660: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  dif.}../*.** Imp
6670: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6680: 68 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c  he stat_push SQL
6690: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74   function:  stat
66a0: 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20  _push(P,C,R).** 
66b0: 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  Arguments:.**.**
66c0: 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65      P     Pointe
66d0: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
66e0: 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74  cum object creat
66f0: 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28  ed by stat_init(
6700: 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e  ).**    C     In
6710: 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  dex of left-most
6720: 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65   column to diffe
6730: 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  r from previous 
6740: 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20  row.**    R     
6750: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  Rowid for the cu
6760: 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68  rrent row.  Migh
6770: 74 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72  t be a key recor
6780: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
6790: 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20    WITHOUT ROWID 
67a0: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
67b0: 69 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  is SQL function 
67c0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e  always returns N
67d0: 55 4c 4c 2e 20 20 49 74 27 73 20 70 75 72 70 6f  ULL.  It's purpo
67e0: 73 65 20 69 74 20 74 6f 20 61 63 63 75 6d 75 6c  se it to accumul
67f0: 61 74 65 0a 2a 2a 20 73 74 61 74 69 73 74 69 63  ate.** statistic
6800: 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f 72 20 73  al data and/or s
6810: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 53 74  amples in the St
6820: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
6830: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64  about the.** ind
6840: 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ex being analyze
6850: 64 2e 20 20 54 68 65 20 73 74 61 74 5f 67 65 74  d.  The stat_get
6860: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
6870: 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 75 73  will later be us
6880: 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74  ed to.** extract
6890: 20 72 65 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d   relevant inform
68a0: 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72  ation for constr
68b0: 75 63 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74  ucting the sqlit
68c0: 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a  e_statN tables..
68d0: 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61  **.** The R para
68e0: 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73  meter is only us
68f0: 65 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64  ed for STAT3 and
6900: 20 53 54 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63   STAT4.*/.static
6910: 20 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a   void statPush(.
6920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6960: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
6970: 20 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   The three funct
6980: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
6990: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
69a0: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
69b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
69c0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
69d0: 6e 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74  nt iChng = sqlit
69e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
69f0: 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44  v[1]);..  UNUSED
6a00: 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63  _PARAMETER( argc
6a10: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
6a20: 41 4d 45 54 45 52 28 20 63 6f 6e 74 65 78 74 20  AMETER( context 
6a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6a40: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65  nCol>0 );.  asse
6a50: 72 74 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f  rt( iChng<p->nCo
6a60: 6c 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  l );..  if( p->n
6a70: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Row==0 ){.    /*
6a80: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
6a90: 73 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  st call to this 
6aa0: 66 75 6e 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69  function. Do ini
6ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a  tialization. */.
6ac0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6ad0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e  ->nCol; i++) p->
6ae0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6af0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
6b00: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20    /* Second and 
6b10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
6b20: 20 67 65 74 20 70 72 6f 63 65 73 73 65 64 20 68   get processed h
6b30: 65 72 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c  ere */.    sampl
6b40: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c  ePushPrevious(p,
6b50: 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a   iChng);..    /*
6b60: 20 55 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c   Update anDLt[],
6b70: 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71   anLt[] and anEq
6b80: 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  [] to reflect th
6b90: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 70  e values that ap
6ba0: 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ply.    ** to th
6bb0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
6bc0: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   the index. */. 
6bd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43     for(i=0; i<iC
6be0: 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  hng; i++){.     
6bf0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
6c00: 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]++;.    }.   
6c10: 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c   for(i=iChng; i<
6c20: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6c30: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
6c40: 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64  anDLt[i]++;.#ifd
6c50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6c60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6c70: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6c80: 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63  .anLt[i] += p->c
6c90: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a  urrent.anEq[i];.
6ca0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e  #endif.      p->
6cb0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6cc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
6cd0: 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64   p->nRow++;.#ifd
6ce0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6cf0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6d00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
6d10: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d  lue_type(argv[2]
6d20: 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )==SQLITE_INTEGE
6d30: 52 20 29 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  R ){.    sampleS
6d40: 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e  etRowidInt64(p->
6d50: 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  db, &p->current,
6d60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6d70: 6e 74 36 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a  nt64(argv[2]));.
6d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d    }else{.    sam
6d90: 70 6c 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64  pleSetRowid(p->d
6da0: 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  b, &p->current, 
6db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6dc0: 74 65 73 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20  tes(argv[2]),.  
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6e00: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29  ue_blob(argv[2])
6e10: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72  );.  }.  p->curr
6e20: 65 6e 74 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69  ent.iHash = p->i
6e30: 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31  Prn = p->iPrn*11
6e40: 30 33 35 31 35 32 34 35 20 2b 20 31 32 33 34 35  03515245 + 12345
6e50: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
6e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6e70: 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f  TAT4.  {.    tRo
6e80: 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75  wcnt nLt = p->cu
6e90: 72 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43  rrent.anLt[p->nC
6ea0: 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43  ol-1];..    /* C
6eb0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
6ec0: 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63  to be a periodic
6ed0: 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20   sample. If so, 
6ee0: 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  add it. */.    i
6ef0: 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d  f( (nLt/p->nPSam
6f00: 70 6c 65 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d  ple)!=(nLt+1)/p-
6f10: 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >nPSample ){.   
6f20: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6f30: 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20  PSample = 1;.   
6f40: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43     p->current.iC
6f50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 61  ol = 0;.      sa
6f60: 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70  mpleInsert(p, &p
6f70: 2d 3e 63 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43  ->current, p->nC
6f80: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ol-1);.      p->
6f90: 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c  current.isPSampl
6fa0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
6fb0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6fc0: 61 42 65 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a  aBest[] array. *
6fd0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6fe0: 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b  <(p->nCol-1); i+
6ff0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  +){.      p->cur
7000: 72 65 6e 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20  rent.iCol = i;. 
7010: 20 20 20 20 20 69 66 28 20 69 3e 3d 69 43 68 6e       if( i>=iChn
7020: 67 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  g || sampleIsBet
7030: 74 65 72 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63  terPost(p, &p->c
7040: 75 72 72 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73  urrent, &p->aBes
7050: 74 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t[i]) ){.       
7060: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26   sampleCopy(p, &
7070: 70 2d 3e 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d  p->aBest[i], &p-
7080: 3e 63 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20  >current);.     
7090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
70a0: 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e  dif.}.static con
70b0: 73 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 50  st FuncDef statP
70c0: 75 73 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20  ushFuncdef = {. 
70d0: 20 32 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20   2+IsStat34,    
70e0: 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53    /* nArg */.  S
70f0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20  QLITE_UTF8,     
7100: 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a  /* funcFlags */.
7110: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7120: 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20     /* pUserData 
7130: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7140: 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
7150: 2f 0a 20 20 73 74 61 74 50 75 73 68 2c 20 20 20  /.  statPush,   
7160: 20 20 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a       /* xSFunc *
7170: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
7180: 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a       /* xFinaliz
7190: 65 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20  e */.  0, 0,    
71a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75          /* xValu
71b0: 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20  e, xInverse */. 
71c0: 20 22 73 74 61 74 5f 70 75 73 68 22 2c 20 20 20   "stat_push",   
71d0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
71e0: 7b 30 7d 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  {0}.};..#define 
71f0: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 30  STAT_GET_STAT1 0
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 74            /* "st
7210: 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  at" column of st
7220: 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  at1 table */.#de
7230: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 52 4f  fine STAT_GET_RO
7240: 57 49 44 20 31 20 20 20 20 20 20 20 20 20 20 2f  WID 1          /
7250: 2a 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  * "rowid" column
7260: 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74   of stat[34] ent
7270: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ry */.#define ST
7280: 41 54 5f 47 45 54 5f 4e 45 51 20 20 20 32 20 20  AT_GET_NEQ   2  
7290: 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 65 71 22          /* "neq"
72a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b   column of stat[
72b0: 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65  34] entry */.#de
72c0: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c  fine STAT_GET_NL
72d0: 54 20 20 20 33 20 20 20 20 20 20 20 20 20 20 2f  T   3          /
72e0: 2a 20 22 6e 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f  * "nlt" column o
72f0: 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79  f stat[34] entry
7300: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54   */.#define STAT
7310: 5f 47 45 54 5f 4e 44 4c 54 20 20 34 20 20 20 20  _GET_NDLT  4    
7320: 20 20 20 20 20 20 2f 2a 20 22 6e 64 6c 74 22 20        /* "ndlt" 
7330: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
7340: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a  4] entry */../*.
7350: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7360: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 5f 67 65  n of the stat_ge
7370: 74 28 50 2c 4a 29 20 53 51 4c 20 66 75 6e 63 74  t(P,J) SQL funct
7380: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
7390: 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  ne is.** used to
73a0: 20 71 75 65 72 79 20 73 74 61 74 69 73 74 69 63   query statistic
73b0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  al information t
73c0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 67 61 74  hat has been gat
73d0: 68 65 72 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  hered into.** th
73e0: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
73f0: 65 63 74 20 62 79 20 70 72 69 6f 72 20 63 61 6c  ect by prior cal
7400: 6c 73 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28  ls to stat_push(
7410: 29 2e 20 20 54 68 65 20 50 20 70 61 72 61 6d 65  ).  The P parame
7420: 74 65 72 0a 2a 2a 20 68 61 73 20 74 79 70 65 20  ter.** has type 
7430: 42 4c 4f 42 20 62 75 74 20 69 74 20 69 73 20 72  BLOB but it is r
7440: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69  eally just a poi
7450: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
7460: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a  4Accum object..*
7470: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f  * The content to
7480: 20 72 65 74 75 72 6e 65 64 20 69 73 20 64 65 74   returned is det
7490: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
74a0: 61 72 61 6d 65 74 65 72 20 4a 0a 2a 2a 20 77 68  arameter J.** wh
74b0: 69 63 68 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ich is one of th
74c0: 65 20 53 54 41 54 5f 47 45 54 5f 78 78 78 78 20  e STAT_GET_xxxx 
74d0: 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 61  values defined a
74e0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bove..**.** The 
74f0: 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 66 75  stat_get(P,J) fu
7500: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
7510: 61 69 6c 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ailable to gener
7520: 69 63 20 53 51 4c 2e 20 20 49 74 20 69 73 0a 2a  ic SQL.  It is.*
7530: 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
7540: 72 74 20 6f 66 20 61 20 6d 61 6e 75 61 6c 6c 79  rt of a manually
7550: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 74   constructed byt
7560: 65 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20 20  ecode program.  
7570: 28 53 65 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  (See.** the call
7580: 53 74 61 74 47 65 74 28 29 20 72 6f 75 74 69 6e  StatGet() routin
7590: 65 20 62 65 6c 6f 77 2e 29 20 20 49 74 20 69 73  e below.)  It is
75a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
75b0: 20 74 68 65 20 50 0a 2a 2a 20 70 61 72 61 6d 65   the P.** parame
75c0: 74 65 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ter will always 
75d0: 62 65 20 61 20 70 6f 69 6e 65 72 20 74 6f 20 61  be a poiner to a
75e0: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
75f0: 63 74 2c 20 6e 65 76 65 72 20 61 0a 2a 2a 20 4e  ct, never a.** N
7600: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ULL..**.** If ne
7610: 69 74 68 65 72 20 53 54 41 54 33 20 6e 6f 72 20  ither STAT3 nor 
7620: 53 54 41 54 34 20 61 72 65 20 65 6e 61 62 6c 65  STAT4 are enable
7630: 64 2c 20 74 68 65 6e 20 4a 20 69 73 20 61 6c 77  d, then J is alw
7640: 61 79 73 0a 2a 2a 20 53 54 41 54 5f 47 45 54 5f  ays.** STAT_GET_
7650: 53 54 41 54 31 20 61 6e 64 20 69 73 20 68 65 6e  STAT1 and is hen
7660: 63 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  ce omitted and t
7670: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 63 6f  his routine beco
7680: 6d 65 73 0a 2a 2a 20 61 20 6f 6e 65 2d 70 61 72  mes.** a one-par
7690: 61 6d 65 74 65 72 20 66 75 6e 63 74 69 6f 6e 2c  ameter function,
76a0: 20 73 74 61 74 5f 67 65 74 28 50 29 2c 20 74 68   stat_get(P), th
76b0: 61 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  at always return
76c0: 73 20 74 68 65 0a 2a 2a 20 73 74 61 74 31 20 74  s the.** stat1 t
76d0: 61 62 6c 65 20 65 6e 74 72 79 20 69 6e 66 6f 72  able entry infor
76e0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
76f0: 63 20 76 6f 69 64 20 73 74 61 74 47 65 74 28 0a  c void statGet(.
7700: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7710: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7720: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7730: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7740: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
7750: 70 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a  p = (Stat4Accum*
7760: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
7770: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  lob(argv[0]);.#i
7780: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7790: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
77a0: 34 0a 20 20 2f 2a 20 53 54 41 54 33 20 61 6e 64  4.  /* STAT3 and
77b0: 20 53 54 41 54 34 20 68 61 76 65 20 61 20 70 61   STAT4 have a pa
77c0: 72 61 6d 65 74 65 72 20 6f 6e 20 74 68 69 73 20  rameter on this 
77d0: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e  routine. */.  in
77e0: 74 20 65 43 61 6c 6c 20 3d 20 73 71 6c 69 74 65  t eCall = sqlite
77f0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
7800: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
7810: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 61 73 73  argc==2 );.  ass
7820: 65 72 74 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54  ert( eCall==STAT
7830: 5f 47 45 54 5f 53 54 41 54 31 20 7c 7c 20 65 43  _GET_STAT1 || eC
7840: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 45  all==STAT_GET_NE
7850: 51 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61  Q .       || eCa
7860: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7870: 49 44 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41  ID || eCall==STA
7880: 54 5f 47 45 54 5f 4e 4c 54 0a 20 20 20 20 20 20  T_GET_NLT.      
7890: 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f   || eCall==STAT_
78a0: 47 45 54 5f 4e 44 4c 54 20 0a 20 20 29 3b 0a 20  GET_NDLT .  );. 
78b0: 20 69 66 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54   if( eCall==STAT
78c0: 5f 47 45 54 5f 53 54 41 54 31 20 29 0a 23 65 6c  _GET_STAT1 ).#el
78d0: 73 65 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  se.  assert( arg
78e0: 63 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20  c==1 );.#endif. 
78f0: 20 7b 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e   {.    /* Return
7900: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 73 74   the value to st
7910: 6f 72 65 20 69 6e 20 74 68 65 20 22 73 74 61 74  ore in the "stat
7920: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
7930: 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 20 20 20  sqlite_stat1.   
7940: 20 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 74 68   ** table for th
7950: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  is index..    **
7960: 0a 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  .    ** The valu
7970: 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f  e is a string co
7980: 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74  mposed of a list
7990: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 64 65 73   of integers des
79a0: 63 72 69 62 69 6e 67 20 0a 20 20 20 20 2a 2a 20  cribing .    ** 
79b0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 20 66  the index. The f
79c0: 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20  irst integer in 
79d0: 74 68 65 20 6c 69 73 74 20 69 73 20 74 68 65 20  the list is the 
79e0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
79f0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
7a00: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
7a10: 65 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74  ere is one addit
7a20: 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e  ional integer in
7a30: 20 74 68 65 20 6c 69 73 74 20 0a 20 20 20 20 2a   the list .    *
7a40: 2a 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  * for each index
7a50: 65 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ed column. This 
7a60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
7a70: 65 72 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  er is an estimat
7a80: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
7a90: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
7aa0: 61 74 63 68 65 64 20 62 79 20 61 20 73 74 61 62  atched by a stab
7ab0: 62 69 6e 67 20 71 75 65 72 79 20 6f 6e 20 74 68  bing query on th
7ac0: 65 20 69 6e 64 65 78 20 75 73 69 6e 67 0a 20 20  e index using.  
7ad0: 20 20 2a 2a 20 61 20 6b 65 79 20 77 69 74 68 20    ** a key with 
7ae0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7af0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  g number of fiel
7b00: 64 73 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ds. In other wor
7b10: 64 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ds,.    ** if th
7b20: 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 63 6f  e index is on co
7b30: 6c 75 6d 6e 73 20 28 61 2c 62 29 20 61 6e 64 20  lumns (a,b) and 
7b40: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
7b50: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 2a   value is .    *
7b60: 2a 20 22 31 30 30 20 31 30 20 32 22 2c 20 74 68  * "100 10 2", th
7b70: 65 6e 20 53 51 4c 69 74 65 20 65 73 74 69 6d 61  en SQLite estima
7b80: 74 65 73 20 74 68 61 74 3a 0a 20 20 20 20 2a 2a  tes that:.    **
7b90: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 74 68 65 20  .    **   * the 
7ba0: 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 31  index contains 1
7bb0: 30 30 20 72 6f 77 73 2c 0a 20 20 20 20 2a 2a 20  00 rows,.    ** 
7bc0: 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 22 20    * "WHERE a=?" 
7bd0: 6d 61 74 63 68 65 73 20 31 30 20 72 6f 77 73 2c  matches 10 rows,
7be0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 2a 20   and.    **   * 
7bf0: 22 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62  "WHERE a=? AND b
7c00: 3d 3f 22 20 6d 61 74 63 68 65 73 20 32 20 72 6f  =?" matches 2 ro
7c10: 77 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws..    **.    *
7c20: 2a 20 49 66 20 44 20 69 73 20 74 68 65 20 63 6f  * If D is the co
7c30: 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63 74 20  unt of distinct 
7c40: 76 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20  values and K is 
7c50: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7c60: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 6f 77 73   of .    ** rows
7c70: 2c 20 74 68 65 6e 20 65 61 63 68 20 65 73 74 69  , then each esti
7c80: 6d 61 74 65 20 69 73 20 63 6f 6d 70 75 74 65 64  mate is computed
7c90: 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   as:.    **.    
7ca0: 2a 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b  **        I = (K
7cb0: 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2f 0a 20  +D-1)/D.    */. 
7cc0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
7cd0: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 63 68 61 72  int i;..    char
7ce0: 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *zRet = sqlite3
7cf0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 28 70 2d 3e  MallocZero( (p->
7d00: 6e 4b 65 79 43 6f 6c 2b 31 29 2a 32 35 20 29 3b  nKeyCol+1)*25 );
7d10: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
7d20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d30: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7d40: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
7d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7d60: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
7d70: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65  snprintf(24, zRe
7d80: 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29  t, "%llu", (u64)
7d90: 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20  p->nRow);.    z 
7da0: 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33  = zRet + sqlite3
7db0: 53 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a  Strlen30(zRet);.
7dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7dd0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
7de0: 0a 20 20 20 20 20 20 75 36 34 20 6e 44 69 73 74  .      u64 nDist
7df0: 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e  inct = p->curren
7e00: 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a  t.anDLt[i] + 1;.
7e10: 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20 3d        u64 iVal =
7e20: 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69 73   (p->nRow + nDis
7e30: 74 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44 69  tinct - 1) / nDi
7e40: 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73 71  stinct;.      sq
7e50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
7e60: 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20 69  4, z, " %llu", i
7e70: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  Val);.      z +=
7e80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7e90: 28 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (z);.      asser
7ea0: 74 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  t( p->current.an
7eb0: 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a 20  Eq[i] );.    }. 
7ec0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
7ed0: 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20  ='\0' && z>zRet 
7ee0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
7ef0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
7f00: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
7f10: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
7f20: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7f30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
7f40: 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66 28  STAT4.  else if(
7f50: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7f60: 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69 66  _ROWID ){.    if
7f70: 28 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a 20  ( p->iGet<0 ){. 
7f80: 20 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68 50       samplePushP
7f90: 72 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a 20  revious(p, 0);. 
7fa0: 20 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20 30       p->iGet = 0
7fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7fc0: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
7fd0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61 74  le ){.      Stat
7fe0: 34 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70 2d  4Sample *pS = p-
7ff0: 3e 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20 20  >a + p->iGet;.  
8000: 20 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f 77      if( pS->nRow
8010: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  id==0 ){.       
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
8040: 53 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  S->u.iRowid);.  
8050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8070: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
8080: 70 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 53  pS->u.aRowid, pS
8090: 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  ->nRowid,.      
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
80c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
80d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
80e0: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43 6e      tRowcnt *aCn
80f0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  t = 0;..    asse
8100: 72 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e  rt( p->iGet<p->n
8110: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73 77  Sample );.    sw
8120: 69 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a 20  itch( eCall ){. 
8130: 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f 47       case STAT_G
8140: 45 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d 20  ET_NEQ:  aCnt = 
8150: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
8160: 45 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Eq; break;.     
8170: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
8180: 4c 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  LT:  aCnt = p->a
8190: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b 20  [p->iGet].anLt; 
81a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
81b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
81c0: 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69  aCnt = p->a[p->i
81d0: 47 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20 20  Get].anDLt; .   
81e0: 20 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a       p->iGet++;.
81f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8210: 20 20 69 66 28 20 49 73 53 74 61 74 33 20 29 7b    if( IsStat3 ){
8220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8230: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
8240: 65 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b 30  ext, (i64)aCnt[0
8250: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
8260: 20 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20       char *zRet 
8270: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
8280: 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35  ero(p->nCol * 25
8290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65  );.      if( zRe
82a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
82b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
82c0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
82d0: 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xt);.      }else
82e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
82f0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8300: 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20   = zRet;.       
8310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8320: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8340: 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c  rintf(24, z, "%l
8350: 6c 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74 5b  lu ", (u64)aCnt[
8360: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  i]);.          z
8370: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8380: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  n30(z);.        
8390: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
83a0: 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20  ( z[0]=='\0' && 
83b0: 7a 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20 20  z>zRet );.      
83c0: 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a    z[-1] = '\0';.
83d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
83e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
83f0: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
8400: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
8410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8420: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8430: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
8440: 5f 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64 65  _STAT4 */.#ifnde
8450: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8460: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8470: 52 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64 69  R( argc );.#endi
8480: 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  f.}.static const
8490: 20 46 75 6e 63 44 65 66 20 73 74 61 74 47 65 74   FuncDef statGet
84a0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
84b0: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
84c0: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
84d0: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
84e0: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
84f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8500: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
8510: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
8520: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
8530: 20 73 74 61 74 47 65 74 2c 20 20 20 20 20 20 20   statGet,       
8540: 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20    /* xSFunc */. 
8550: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
8560: 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a    /* xFinalize *
8570: 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  /.  0, 0,       
8580: 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20       /* xValue, 
8590: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73  xInverse */.  "s
85a0: 74 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f  tat_get",      /
85b0: 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d  * zName */.  {0}
85c0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
85d0: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62   callStatGet(Vdb
85e0: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61  e *v, int regSta
85f0: 74 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20  t4, int iParam, 
8600: 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61  int regOut){.  a
8610: 73 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72  ssert( regOut!=r
8620: 65 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75  egStat4 && regOu
8630: 74 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b  t!=regStat4+1 );
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8650: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8660: 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64  TAT4.  sqlite3Vd
8670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8680: 6e 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20  nteger, iParam, 
8690: 72 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c  regStat4+1);.#el
86a0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
86b0: 20 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d    assert( iParam
86c0: 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31  ==STAT_GET_STAT1
86d0: 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53   );.#else.  UNUS
86e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50  ED_PARAMETER( iP
86f0: 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20  aram );.#endif. 
8700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8710: 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
8720: 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c  n0, 0, regStat4,
8730: 20 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20   regOut,.       
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
8750: 61 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63  ar*)&statGetFunc
8760: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
8770: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
8780: 68 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49  hangeP5(v, 1 + I
8790: 73 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a  sStat34);.}../*.
87a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
87b0: 20 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73   to do an analys
87c0: 69 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65  is of all indice
87d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
87e0: 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  h.** a single ta
87f0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
8800: 6f 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61  oid analyzeOneTa
8810: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
8820: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
8830: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
8840: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8850: 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69  /* Table whose i
8860: 6e 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65  ndices are to be
8870: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
8880: 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20  ndex *pOnlyIdx, 
8890: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
88a0: 6f 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69  only analyze thi
88b0: 73 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s one index */. 
88c0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
88d0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64    /* Index of Vd
88e0: 62 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72  beCursor that wr
88f0: 69 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  ites the sqlite_
8900: 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20  stat1 table */. 
8910: 20 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20   int iMem,      
8920: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
8930: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
8940: 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20  begin here */.  
8950: 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20  int iTab        
8960: 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
8970: 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  le cursor */.){.
8980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8990: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f  pParse->db;    /
89a0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
89b0: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
89c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
89d0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
89e0: 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  to being analyze
89f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  d */.  int iIdxC
8a00: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
8a10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
8a20: 65 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e  en on index bein
8a30: 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
8a40: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a60: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a  Table cursor */.
8a70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a90: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
8aa0: 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c  chine being buil
8ab0: 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  t up */.  int i;
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8ae0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8af0: 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20  jZeroRows = -1; 
8b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
8b10: 20 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75   from here if nu
8b20: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20  mber of rows is 
8b30: 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44  zero */.  int iD
8b40: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8b50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8b60: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
8b70: 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20  aining pTab */. 
8b80: 20 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74   u8 needTableCnt
8b90: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 1;         /*
8ba0: 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74   True to count t
8bb0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
8bc0: 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  t regNewRowid = 
8bd0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f  iMem++;    /* Ro
8be0: 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65  wid for the inse
8bf0: 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rted record */. 
8c00: 20 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20   int regStat4 = 
8c10: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a  iMem++;       /*
8c20: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
8c30: 64 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  d Stat4Accum obj
8c40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ect */.  int reg
8c50: 43 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  Chng = iMem++;  
8c60: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8c70: 66 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20  f changed index 
8c80: 66 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20  field */.#ifdef 
8c90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
8ca0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
8cb0: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d  nt regRowid = iM
8cc0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52  em++;       /* R
8cd0: 6f 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61  owid argument pa
8ce0: 73 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73  ssed to stat_pus
8cf0: 68 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  h() */.#endif.  
8d00: 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d  int regTemp = iM
8d10: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20  em++;        /* 
8d20: 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
8d30: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
8d40: 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65  regTabname = iMe
8d50: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8d60: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8d70: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
8d80: 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d  int regIdxname =
8d90: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20   iMem++;     /* 
8da0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
8db0: 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a  ing index name *
8dc0: 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31  /.  int regStat1
8dd0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
8de0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68   /* Value for th
8df0: 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66  e stat column of
8e00: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f   sqlite_stat1 */
8e10: 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d  .  int regPrev =
8e20: 20 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   iMem;          
8e30: 2f 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20  /* MUST BE LAST 
8e40: 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23  (see below) */.#
8e50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e60: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
8e70: 4f 4b 0a 20 20 54 61 62 6c 65 20 2a 70 53 74 61  OK.  Table *pSta
8e80: 74 31 20 3d 20 30 3b 20 0a 23 65 6e 64 69 66 0a  t1 = 0; .#endif.
8e90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
8ea0: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d  = MAX(pParse->nM
8eb0: 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d  em, iMem);.  v =
8ec0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8ed0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8ee0: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61  ==0 || NEVER(pTa
8ef0: 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  b==0) ){.    ret
8f00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
8f10: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  Tab->tnum==0 ){.
8f20: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61      /* Do not ga
8f30: 74 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20  ther statistics 
8f40: 6f 6e 20 76 69 65 77 73 20 6f 72 20 76 69 72 74  on views or virt
8f50: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
8f60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
8f80: 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22  ike("sqlite\\_%"
8f90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 27  , pTab->zName, '
8fa0: 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  \\')==0 ){.    /
8fb0: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
8fc0: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79  statistics on sy
8fd0: 73 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  stem tables */. 
8fe0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8ff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9000: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
9010: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44  exes(db) );.  iD
9020: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
9030: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
9040: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
9050: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
9060: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9070: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
9080: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
9090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
90a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
90b0: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
90c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
90d0: 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  , SQLITE_ANALYZE
90e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
90f0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
9100: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
9110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9120: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
9130: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9140: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
9150: 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64   if( db->xPreUpd
9160: 61 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ateCallback ){. 
9170: 20 20 20 70 53 74 61 74 31 20 3d 20 28 54 61 62     pStat1 = (Tab
9180: 6c 65 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  le*)sqlite3DbMal
9190: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
91a0: 6f 66 28 54 61 62 6c 65 29 20 2b 20 31 33 29 3b  of(Table) + 13);
91b0: 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 31 3d  .    if( pStat1=
91c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
91d0: 20 70 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d   pStat1->zName =
91e0: 20 28 63 68 61 72 2a 29 26 70 53 74 61 74 31 5b   (char*)&pStat1[
91f0: 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
9200: 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73  Stat1->zName, "s
9210: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 31 33  qlite_stat1", 13
9220: 29 3b 0a 20 20 20 20 70 53 74 61 74 31 2d 3e 6e  );.    pStat1->n
9230: 43 6f 6c 20 3d 20 33 3b 0a 20 20 20 20 70 53 74  Col = 3;.    pSt
9240: 61 74 31 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  at1->iPKey = -1;
9250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9260: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
9270: 56 64 62 65 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Vdbe, OP_Noop, 0
9280: 2c 20 30 2c 20 30 2c 28 63 68 61 72 2a 29 70 53  , 0, 0,(char*)pS
9290: 74 61 74 31 2c 50 34 5f 44 59 4e 42 4c 4f 42 29  tat1,P4_DYNBLOB)
92a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
92b0: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72  /* Establish a r
92c0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
92d0: 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61  table at the sha
92e0: 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e  red-cache level.
92f0: 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65   .  ** Open a re
9300: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
9310: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73  n the table. Als
9320: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  o allocate a cur
9330: 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  sor number.  ** 
9340: 74 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e  to use for scann
9350: 69 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64  ing indexes (iId
9360: 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20  xCur). No index 
9370: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
9380: 20 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69   at.  ** this ti
9390: 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20  me though.  */. 
93a0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
93b0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
93c0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
93d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54  ab->zName);.  iT
93e0: 61 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  abCur = iTab++;.
93f0: 20 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62    iIdxCur = iTab
9400: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ++;.  pParse->nT
9410: 61 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  ab = MAX(pParse-
9420: 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20  >nTab, iTab);.  
9430: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
9440: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
9450: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
9460: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c  OpenRead);.  sql
9470: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
9480: 6e 67 28 76 2c 20 72 65 67 54 61 62 6e 61 6d 65  ng(v, regTabname
9490: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
94a0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
94b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
94c0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
94d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  ){.    int nCol;
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9500: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64  f columns in pId
9510: 78 2e 20 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e  x. "N" */.    in
9520: 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20  t addrRewind;   
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9540: 64 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65  ddress of "OP_Re
9550: 77 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f  wind iIdxCur" */
9560: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
9570: 74 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  tRow;           
9580: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
9590: 20 22 6e 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a   "next_row:" */.
95a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
95b0: 7a 49 64 78 4e 61 6d 65 3b 20 20 20 20 20 20 20  zIdxName;       
95c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
95d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
95e0: 74 20 6e 43 6f 6c 54 65 73 74 3b 20 20 20 20 20  t nColTest;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9600: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9610: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 63 68 61   to test for cha
9620: 6e 67 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28  nges */..    if(
9630: 20 70 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e   pOnlyIdx && pOn
9640: 6c 79 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f  lyIdx!=pIdx ) co
9650: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9660: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
9670: 65 72 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62  ere==0 ) needTab
9680: 6c 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  leCnt = 0;.    i
9690: 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
96a0: 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
96b0: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  eyIndex(pIdx) ){
96c0: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
96d0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
96e0: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54     zIdxName = pT
96f0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9700: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c   nColTest = nCol
9710: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
9720: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
9730: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
9740: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49     zIdxName = pI
9750: 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  dx->zName;.     
9760: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 70 49 64 78   nColTest = pIdx
9770: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
9780: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20  pIdx->nKeyCol-1 
9790: 3a 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a  : nCol-1;.    }.
97a0: 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
97b0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 63 6f   the register co
97c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
97d0: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ex name. */.    
97e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
97f0: 74 72 69 6e 67 28 76 2c 20 72 65 67 49 64 78 6e  tring(v, regIdxn
9800: 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a  ame, zIdxName);.
9810: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9820: 28 76 2c 20 22 41 6e 61 6c 79 73 69 73 20 66 6f  (v, "Analysis fo
9830: 72 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e  r %s.%s", pTab->
9840: 7a 4e 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29  zName, zIdxName)
9850: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
9860: 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f  * Pseudo-code fo
9870: 72 20 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c  r loop that call
9880: 73 20 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20  s stat_push():. 
9890: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52     **.    **   R
98a0: 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a  ewind csr.    **
98b0: 20 20 20 69 66 20 65 6f 66 28 63 73 72 29 20 67     if eof(csr) g
98c0: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b  oto end_of_scan;
98d0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
98e0: 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67  g = 0.    **   g
98f0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b  oto chng_addr_0;
9900: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9910: 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a  next_row:.    **
9920: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20     regChng = 0. 
9930: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
9940: 30 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29  0) != regPrev(0)
9950: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
9960: 72 5f 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  r_0.    **   reg
9970: 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20  Chng = 1.    ** 
9980: 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d 20    if( idx(1) != 
9990: 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f 74  regPrev(1) ) got
99a0: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20  o chng_addr_1.  
99b0: 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a    **   ....    *
99c0: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a  *   regChng = N.
99d0: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68      **   goto ch
99e0: 6e 67 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a  ng_addr_N.    **
99f0: 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64  .    **  chng_ad
9a00: 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72  dr_0:.    **   r
9a10: 65 67 50 72 65 76 28 30 29 20 3d 20 69 64 78 28  egPrev(0) = idx(
9a20: 30 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  0).    **  chng_
9a30: 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20  addr_1:.    **  
9a40: 20 72 65 67 50 72 65 76 28 31 29 20 3d 20 69 64   regPrev(1) = id
9a50: 78 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e  x(1).    **  ...
9a60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9a70: 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 3a  endDistinctTest:
9a80: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77  .    **   regRow
9a90: 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 0a  id = idx(rowid).
9aa0: 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75      **   stat_pu
9ab0: 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72  sh(P, regChng, r
9ac0: 65 67 52 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20  egRowid).    ** 
9ad0: 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a    Next csr.    *
9ae0: 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29  *   if !eof(csr)
9af0: 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a   goto next_row;.
9b00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65      **.    **  e
9b10: 6e 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20  nd_of_scan:.    
9b20: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
9b30: 73 75 72 65 20 74 68 65 72 65 20 61 72 65 20 65  sure there are e
9b40: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c  nough memory cel
9b50: 6c 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ls allocated to 
9b60: 61 63 63 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20  accommodate .   
9b70: 20 2a 2a 20 74 68 65 20 72 65 67 50 72 65 76 20   ** the regPrev 
9b80: 61 72 72 61 79 20 61 6e 64 20 61 20 74 72 61 69  array and a trai
9b90: 6c 69 6e 67 20 72 6f 77 69 64 20 28 74 68 65 20  ling rowid (the 
9ba0: 72 6f 77 69 64 20 73 6c 6f 74 20 69 73 20 72 65  rowid slot is re
9bb0: 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 77 68  quired.    ** wh
9bc0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 61 20 72 65  en building a re
9bd0: 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69  cord to insert i
9be0: 6e 74 6f 20 74 68 65 20 73 61 6d 70 6c 65 20 63  nto the sample c
9bf0: 6f 6c 75 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a  olumn of .    **
9c00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
9c10: 34 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  4 table.  */.   
9c20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9c30: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
9c40: 2c 20 72 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65  , regPrev+nColTe
9c50: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  st);..    /* Ope
9c60: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
9c70: 72 73 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65  rsor on the inde
9c80: 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  x being analyzed
9c90: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
9ca0: 20 69 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68   iDb==sqlite3Sch
9cb0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
9cc0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  Idx->pSchema) );
9cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ce0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
9cf0: 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
9d00: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
9d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9d20: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
9d30: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
9d40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
9d50: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
9d60: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  me));..    /* In
9d70: 76 6f 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e  voke the stat_in
9d80: 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54  it() function. T
9d90: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
9da0: 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  :.    ** .    **
9db0: 20 20 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62      (1) the numb
9dc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9dd0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75   the index inclu
9de0: 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20  ding the rowid. 
9df0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 6f 72     **        (or
9e00: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
9e10: 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 20  OWID table, the 
9e20: 6e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c  number of PK col
9e30: 75 6d 6e 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20  umns),.    **   
9e40: 20 28 32 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (2) the number 
9e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9e60: 65 20 6b 65 79 20 77 69 74 68 6f 75 74 20 74 68  e key without th
9e70: 65 20 72 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a  e rowid/pk.    *
9e80: 2a 20 20 20 20 28 33 29 20 74 68 65 20 6e 75 6d  *    (3) the num
9e90: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
9ea0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
9eb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
9ec0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
9ed0: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  t is only used f
9ee0: 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  or STAT3 and STA
9ef0: 54 34 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  T4.    */.#ifdef
9f00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9f10: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
9f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f30: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
9f40: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
9f50: 74 34 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t4+3);.#endif.  
9f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9f80: 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74  r, nCol, regStat
9f90: 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
9fa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9fb0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
9fc0: 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61  >nKeyCol, regSta
9fd0: 74 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+2);.    sqlit
9fe0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9ff0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
a000: 20 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67   regStat4+1, reg
a010: 53 74 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20  Stat4,.         
a020: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
a030: 72 2a 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63  r*)&statInitFunc
a040: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
a050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a060: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
a070: 73 53 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f  sStat34);..    /
a080: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
a090: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a0a0: 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
a0b0: 20 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20     Rewind csr.  
a0c0: 20 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73    **   if eof(cs
a0d0: 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73  r) goto end_of_s
a0e0: 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65  can;.    **   re
a0f0: 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a  gChng = 0.    **
a100: 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73     goto next_pus
a110: 68 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  h_0;.    **.    
a120: 2a 2f 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e  */.    addrRewin
a130: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
a140: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
a150: 6e 64 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20  nd, iIdxCur);.  
a160: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a180: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a190: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68  nteger, 0, regCh
a1a0: 6e 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78  ng);.    addrNex
a1b0: 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
a1c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a1d0: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54  ;..    if( nColT
a1e0: 65 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  est>0 ){.      i
a1f0: 6e 74 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65  nt endDistinctTe
a200: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
a210: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
a220: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 47  );.      int *aG
a230: 6f 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20 20  otoChng;        
a240: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a250: 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  of jump instruct
a260: 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a 2f  ion addresses */
a270: 0a 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67  .      aGotoChng
a280: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a290: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
a2a0: 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73 74  of(int)*nColTest
a2b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47 6f  );.      if( aGo
a2c0: 74 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e 74  toChng==0 ) cont
a2d0: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a  inue;..      /*.
a2e0: 20 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72        **  next_r
a2f0: 6f 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  ow:.      **   r
a300: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 20  egChng = 0.     
a310: 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29   **   if( idx(0)
a320: 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29   != regPrev(0) )
a330: 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f   goto chng_addr_
a340: 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  0.      **   reg
a350: 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20 2a  Chng = 1.      *
a360: 2a 20 20 20 69 66 28 20 69 64 78 28 31 29 20 21  *   if( idx(1) !
a370: 3d 20 72 65 67 50 72 65 76 28 31 29 20 29 20 67  = regPrev(1) ) g
a380: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a  oto chng_addr_1.
a390: 20 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20        **   .... 
a3a0: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e       **   regChn
a3b0: 67 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20  g = N.      **  
a3c0: 20 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e 63   goto endDistinc
a3d0: 74 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20  tTest.      */. 
a3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
a400: 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e 65  o);.      addrNe
a410: 78 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  xtRow = sqlite3V
a420: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f  );.      if( nCo
a440: 6c 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64 78  lTest==1 && pIdx
a450: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
a460: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
a470: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  dx) ){.        /
a480: 2a 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d 63  * For a single-c
a490: 6f 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e 64  olumn UNIQUE ind
a4a0: 65 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76 65  ex, once we have
a4b0: 20 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c   found a non-NUL
a4c0: 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  L.        ** row
a4d0: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  , we know that a
a4e0: 6c 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c 6c  ll the rest will
a4f0: 20 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73 6f   be distinct, so
a500: 20 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20 2a   skip .        *
a510: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 64 69 73  * subsequent dis
a520: 74 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73 2e  tinctness tests.
a530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
a540: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a550: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
a560: 50 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e 63  Prev, endDistinc
a570: 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tTest);.        
a580: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a5a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65  or(i=0; i<nColTe
a5b0: 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  st; i++){.      
a5c0: 20 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d 20    char *pColl = 
a5d0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f  (char*)sqlite3Lo
a5e0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
a5f0: 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  se, pIdx->azColl
a600: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
a610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a620: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
a630: 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20  , regChng);.    
a640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a650: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a660: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20  mn, iIdxCur, i, 
a670: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
a680: 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d    aGotoChng[i] =
a690: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a6a0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6b0: 50 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20 30  P_Ne, regTemp, 0
a6c0: 2c 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43 6f  , regPrev+i, pCo
a6d0: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
a6e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a700: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
a710: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a720: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
a730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a740: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a750: 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73 74  nteger, nColTest
a760: 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20  , regChng);.    
a770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
a780: 6f 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74  o(v, endDistinct
a790: 54 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20 20  Test);.  .  .   
a7a0: 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20     /*.      **  
a7b0: 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20  chng_addr_0:.   
a7c0: 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28     **   regPrev(
a7d0: 30 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20  0) = idx(0).    
a7e0: 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f    **  chng_addr_
a7f0: 31 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  1:.      **   re
a800: 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31  gPrev(1) = idx(1
a810: 29 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a  ).      **  ....
a820: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
a830: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a840: 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52 6f  re(v, addrNextRo
a850: 77 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  w-1);.      for(
a860: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b  i=0; i<nColTest;
a870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
a880: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a890: 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b  re(v, aGotoChng[
a8a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
a8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a8c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
a8d0: 78 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65 76  xCur, i, regPrev
a8e0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
a8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a900: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
a910: 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a  dDistinctTest);.
a920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a930: 72 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68 6e  ree(db, aGotoChn
a940: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
a950: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67   /*.    **  chng
a960: 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20  _addr_N:.    ** 
a970: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78    regRowid = idx
a980: 28 72 6f 77 69 64 29 20 20 20 20 20 20 20 20 20  (rowid)         
a990: 20 20 20 2f 2f 20 53 54 41 54 33 34 20 6f 6e 6c     // STAT34 onl
a9a0: 79 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f  y.    **   stat_
a9b0: 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c  push(P, regChng,
a9c0: 20 72 65 67 52 6f 77 69 64 29 20 20 2f 2f 20 33   regRowid)  // 3
a9d0: 72 64 20 70 61 72 61 6d 65 74 65 72 20 53 54 41  rd parameter STA
a9e0: 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  T34 only.    ** 
a9f0: 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a    Next csr.    *
aa00: 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29  *   if !eof(csr)
aa10: 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a   goto next_row;.
aa20: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
aa30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
aa40: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 61  3_OR_STAT4.    a
aa50: 73 73 65 72 74 28 20 72 65 67 52 6f 77 69 64 3d  ssert( regRowid=
aa60: 3d 28 72 65 67 53 74 61 74 34 2b 32 29 20 29 3b  =(regStat4+2) );
aa70: 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
aa80: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
aa90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aaa0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
aab0: 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 52  d, iIdxCur, regR
aac0: 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
aad0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
aae0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
aaf0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
ab00: 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->pTable);.     
ab10: 20 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b 65   int j, k, regKe
ab20: 79 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79 20  y;.      regKey 
ab30: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ab40: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50  Range(pParse, pP
ab50: 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
ab60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
ab70: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
ab80: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71  {.        k = sq
ab90: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
aba0: 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69  ex(pIdx, pPk->ai
abb0: 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20  Column[j]);.    
abc0: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d 30      assert( k>=0
abd0: 20 26 26 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && k<pIdx->nCol
abe0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  umn );.        s
abf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac00: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ac10: 49 64 78 43 75 72 2c 20 6b 2c 20 72 65 67 4b 65  IdxCur, k, regKe
ac20: 79 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 56 64  y+j);.        Vd
ac30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ac40: 73 22 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  s", pTab->aCol[p
ac50: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Pk->aiColumn[j]]
ac60: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  .zName));.      
ac70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
ac80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac90: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4b  MakeRecord, regK
aca0: 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ey, pPk->nKeyCol
acb0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
acc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
acd0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
ace0: 65 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e  e, regKey, pPk->
acf0: 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  nKeyCol);.    }.
ad00: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
ad10: 74 28 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67  t( regChng==(reg
ad20: 53 74 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20  Stat4+1) );.    
ad30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad40: 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
ad50: 30 2c 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20  0, 1, regStat4, 
ad60: 72 65 67 54 65 6d 70 2c 0a 20 20 20 20 20 20 20  regTemp,.       
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
ad80: 68 61 72 2a 29 26 73 74 61 74 50 75 73 68 46 75  har*)&statPushFu
ad90: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
ada0: 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
adb0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32  dbeChangeP5(v, 2
adc0: 2b 49 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20  +IsStat34);.    
add0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ade0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
adf0: 64 78 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52  dxCur, addrNextR
ae00: 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ow); VdbeCoverag
ae10: 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  e(v);..    /* Ad
ae20: 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
ae30: 68 65 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20  he stat1 table. 
ae40: 2a 2f 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47  */.    callStatG
ae50: 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20  et(v, regStat4, 
ae60: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20  STAT_GET_STAT1, 
ae70: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 61  regStat1);.    a
ae80: 73 73 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d  ssert( "BBB"[0]=
ae90: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
aea0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
aeb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
aec0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
aed0: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65  abname, 3, regTe
aee0: 6d 70 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20  mp, "BBB", 0);. 
aef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af00: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
af10: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72  wid, iStatCur, r
af20: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
af30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af40: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
af50: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 54 65   iStatCur, regTe
af60: 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  mp, regNewRowid)
af70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
af80: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
af90: 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65  _HOOK.    sqlite
afa0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
afb0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 53 74 61   -1, (char*)pSta
afc0: 74 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23  t1, P4_TABLE);.#
afd0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
afe0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
aff0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b000: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
b010: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
b020: 73 74 61 74 33 20 6f 72 20 73 74 61 74 34 20 74  stat3 or stat4 t
b030: 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
b040: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b050: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
b060: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67   {.      int reg
b070: 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b 0a 20  Eq = regStat1;. 
b080: 20 20 20 20 20 69 6e 74 20 72 65 67 4c 74 20 3d       int regLt =
b090: 20 72 65 67 53 74 61 74 31 2b 31 3b 0a 20 20 20   regStat1+1;.   
b0a0: 20 20 20 69 6e 74 20 72 65 67 44 4c 74 20 3d 20     int regDLt = 
b0b0: 72 65 67 53 74 61 74 31 2b 32 3b 0a 20 20 20 20  regStat1+2;.    
b0c0: 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65 20    int regSample 
b0d0: 3d 20 72 65 67 53 74 61 74 31 2b 33 3b 0a 20 20  = regStat1+3;.  
b0e0: 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 20 3d      int regCol =
b0f0: 20 72 65 67 53 74 61 74 31 2b 34 3b 0a 20 20 20   regStat1+4;.   
b100: 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65     int regSample
b110: 52 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c 20 2b  Rowid = regCol +
b120: 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74   nCol;.      int
b130: 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20 20 20   addrNext;.     
b140: 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 3b   int addrIsNull;
b150: 0a 20 20 20 20 20 20 75 38 20 73 65 65 6b 4f 70  .      u8 seekOp
b160: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
b170: 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ) ? OP_NotExists
b180: 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a   : OP_NotFound;.
b190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
b1a0: 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65  Mem = MAX(pParse
b1b0: 2d 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f 6c 2b 6e  ->nMem, regCol+n
b1c0: 43 6f 6c 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  Col);..      add
b1d0: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
b1e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b1f0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b200: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b210: 2c 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44  , STAT_GET_ROWID
b220: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
b230: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 73 4e  );.      addrIsN
b240: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
b250: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
b260: 4e 75 6c 6c 2c 20 72 65 67 53 61 6d 70 6c 65 52  Null, regSampleR
b270: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62  owid);.      Vdb
b280: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b290: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
b2a0: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
b2b0: 54 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67 45 71  T_GET_NEQ, regEq
b2c0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b2d0: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b2e0: 2c 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 2c 20  , STAT_GET_NLT, 
b2f0: 72 65 67 4c 74 29 3b 0a 20 20 20 20 20 20 63 61  regLt);.      ca
b300: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
b310: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
b320: 4e 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b 0a 20  NDLT, regDLt);. 
b330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b340: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 73 65 65  AddOp4Int(v, see
b350: 6b 4f 70 2c 20 69 54 61 62 43 75 72 2c 20 61 64  kOp, iTabCur, ad
b360: 64 72 4e 65 78 74 2c 20 72 65 67 53 61 6d 70 6c  drNext, regSampl
b370: 65 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  eRowid, 0);.    
b380: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b390: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
b3a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
b3b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b3c0: 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
b3d0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  mn(pParse, pIdx,
b3e0: 20 69 54 61 62 43 75 72 2c 20 30 2c 20 72 65 67   iTabCur, 0, reg
b3f0: 53 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20  Sample);.#else. 
b400: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b410: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b430: 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
b440: 6d 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  mn(pParse, pIdx,
b450: 20 69 54 61 62 43 75 72 2c 20 69 2c 20 72 65 67   iTabCur, i, reg
b460: 43 6f 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  Col+i);.      }.
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b480: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b490: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 43 6f 6c  keRecord, regCol
b4a0: 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 61 6d 70 6c  , nCol, regSampl
b4b0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  e);.#endif.     
b4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4d0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b4e0: 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  ord, regTabname,
b4f0: 20 36 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20   6, regTemp);.  
b500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
b520: 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31  owid, iStatCur+1
b530: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b550: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b560: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31  sert, iStatCur+1
b570: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
b580: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  wRowid);.      s
b590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5a0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20  (v, OP_Goto, 1, 
b5b0: 61 64 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31  addrNext); /* P1
b5c0: 3d 3d 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c  ==1 for end-of-l
b5d0: 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  oop */.      sql
b5e0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b5f0: 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b  (v, addrIsNull);
b600: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
b610: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b620: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
b630: 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ..    /* End of 
b640: 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20  analysis */.    
b650: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b660: 65 72 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e  ere(v, addrRewin
b670: 64 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43  d);.  }...  /* C
b680: 72 65 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73  reate a single s
b690: 71 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72  qlite_stat1 entr
b6a0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c  y containing NUL
b6b0: 4c 20 61 73 20 74 68 65 20 69 6e 64 65 78 0a 20  L as the index. 
b6c0: 20 2a 2a 20 6e 61 6d 65 20 61 6e 64 20 74 68 65   ** name and the
b6d0: 20 72 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68   row count as th
b6e0: 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a  e content..  */.
b6f0: 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 3d 3d    if( pOnlyIdx==
b700: 30 20 26 26 20 6e 65 65 64 54 61 62 6c 65 43 6e  0 && needTableCn
b710: 74 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  t ){.    VdbeCom
b720: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
b730: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
b740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b750: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
b760: 20 69 54 61 62 43 75 72 2c 20 72 65 67 53 74 61   iTabCur, regSta
b770: 74 31 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f  t1);.    jZeroRo
b780: 77 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ws = sqlite3Vdbe
b790: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
b7a0: 6f 74 2c 20 72 65 67 53 74 61 74 31 29 3b 20 56  ot, regStat1); V
b7b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b7c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b7d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b7e0: 2c 20 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29  , 0, regIdxname)
b7f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 22 42  ;.    assert( "B
b800: 42 42 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  BB"[0]==SQLITE_A
b810: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73  FF_TEXT );.    s
b820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b830: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b840: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33  d, regTabname, 3
b850: 2c 20 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22  , regTemp, "BBB"
b860: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b870: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b880: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
b890: 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  tCur, regNewRowi
b8a0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
b8b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b8c0: 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72  Insert, iStatCur
b8d0: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
b8e0: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
b8f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b900: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
b910: 44 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  D);.#ifdef SQLIT
b920: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
b930: 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69  TE_HOOK.    sqli
b940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
b950: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 53  v, -1, (char*)pS
b960: 74 61 74 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b  tat1, P4_TABLE);
b970: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
b980: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b990: 76 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20  v, jZeroRows);. 
b9a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
b9b0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
b9c0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d  will cause the m
b9d0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78  ost recent index
b9e0: 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20   analysis to.** 
b9f0: 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69  be loaded into i
ba00: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
ba10: 6c 65 73 20 77 68 65 72 65 20 69 73 20 63 61 6e  les where is can
ba20: 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61   be used..*/.sta
ba30: 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61  tic void loadAna
ba40: 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70 50 61  lysis(Parse *pPa
ba50: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
ba60: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ba70: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ba80: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
ba90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
baa0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e  Op1(v, OP_LoadAn
bab0: 61 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20 20  alysis, iDb);.  
bac0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
bad0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
bae0: 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ll do an analysi
baf0: 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20 64  s of an entire d
bb00: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
bb10: 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61  c void analyzeDa
bb20: 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
bb30: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
bb40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bb50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63  pParse->db;.  Sc
bb60: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
bb70: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
bb80: 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65  hema;    /* Sche
bb90: 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  ma of database i
bba0: 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  Db */.  HashElem
bbb0: 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74   *k;.  int iStat
bbc0: 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  Cur;.  int iMem;
bbd0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 0a 20 20  .  int iTab;..  
bbe0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69  sqlite3SchemaWri
bbf0: 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  table(pParse, iD
bc00: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  b);.  sqlite3Beg
bc10: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
bc20: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
bc30: 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70  ;.  iStatCur = p
bc40: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70  Parse->nTab;.  p
bc50: 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33  Parse->nTab += 3
bc60: 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c  ;.  openStatTabl
bc70: 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69  e(pParse, iDb, i
bc80: 53 74 61 74 43 75 72 2c 20 30 2c 20 30 29 3b 0a  StatCur, 0, 0);.
bc90: 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    iMem = pParse-
bca0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54 61 62 20  >nMem+1;.  iTab 
bcb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
bcc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bcd0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
bce0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
bcf0: 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
bd00: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
bd10: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b  ->tblHash); k; k
bd20: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
bd30: 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  k)){.    Table *
bd40: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
bd50: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
bd60: 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65  ;.    analyzeOne
bd70: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
bd80: 61 62 2c 20 30 2c 20 69 53 74 61 74 43 75 72 2c  ab, 0, iStatCur,
bd90: 20 69 4d 65 6d 2c 20 69 54 61 62 29 3b 0a 20 20   iMem, iTab);.  
bda0: 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73  }.  loadAnalysis
bdb0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d  (pParse, iDb);.}
bdc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bdd0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
bde0: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
bdf0: 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  f a single table
be00: 20 69 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73   in.** a databas
be10: 65 2e 20 20 49 66 20 70 4f 6e 6c 79 49 64 78 20  e.  If pOnlyIdx 
be20: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
be30: 20 69 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20   it is a single 
be40: 69 6e 64 65 78 0a 2a 2a 20 69 6e 20 70 54 61 62  index.** in pTab
be50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
be60: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61  analyzed..*/.sta
be70: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
be80: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
be90: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
bea0: 2c 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64  , Index *pOnlyId
beb0: 78 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  x){.  int iDb;. 
bec0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 0a   int iStatCur;..
bed0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
bee0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
bef0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
bf00: 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73  AllMutexes(pPars
bf10: 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62 20  e->db) );.  iDb 
bf20: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
bf30: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
bf40: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
bf50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
bf60: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
bf70: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
bf80: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
bf90: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50  arse->nTab;.  pP
bfa0: 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b  arse->nTab += 3;
bfb0: 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20  .  if( pOnlyIdx 
bfc0: 29 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54  ){.    openStatT
bfd0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
bfe0: 2c 20 69 53 74 61 74 43 75 72 2c 20 70 4f 6e 6c  , iStatCur, pOnl
bff0: 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64  yIdx->zName, "id
c000: 78 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  x");.  }else{.  
c010: 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28    openStatTable(
c020: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74  pParse, iDb, iSt
c030: 61 74 43 75 72 2c 20 70 54 61 62 2d 3e 7a 4e 61  atCur, pTab->zNa
c040: 6d 65 2c 20 22 74 62 6c 22 29 3b 0a 20 20 7d 0a  me, "tbl");.  }.
c050: 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c    analyzeOneTabl
c060: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
c070: 70 4f 6e 6c 79 49 64 78 2c 20 69 53 74 61 74 43  pOnlyIdx, iStatC
c080: 75 72 2c 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  ur,pParse->nMem+
c090: 31 2c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  1,pParse->nTab);
c0a0: 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  .  loadAnalysis(
c0b0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a  pParse, iDb);.}.
c0c0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c0d0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41  code for the ANA
c0e0: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54  LYZE command.  T
c0f0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
c100: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
c110: 77 68 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a  when it recogniz
c120: 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f  es an ANALYZE co
c130: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
c140: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20      ANALYZE     
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
c170: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c        ANALYZE  <
c180: 64 61 74 61 62 61 73 65 3e 20 20 20 20 20 20 20  database>       
c190: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
c1a0: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
c1b0: 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
c1c0: 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
c1d0: 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
c1e0: 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
c1f0: 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
c200: 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
c210: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72  analyzed..** For
c220: 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 2 analyzes all
c230: 20 69 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e   indices the sin
c240: 67 6c 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  gle database nam
c250: 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e  ed..** Form 3 an
c260: 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63  alyzes all indic
c270: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
c280: 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
c290: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
c2a0: 74 65 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65  te3Analyze(Parse
c2b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
c2c0: 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
c2d0: 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74  pName2){.  sqlit
c2e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c2f0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
c300: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
c310: 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c  *z, *zDb;.  Tabl
c320: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
c330: 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20   *pIdx;.  Token 
c340: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 56  *pTableName;.  V
c350: 64 62 65 20 2a 76 3b 0a 0a 20 20 2f 2a 20 52 65  dbe *v;..  /* Re
c360: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
c370: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
c380: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
c390: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
c3a0: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
c3b0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
c3c0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
c3d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c3e0: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
c3f0: 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29  exes(pParse->db)
c400: 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
c410: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
c420: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
c430: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
c440: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  }..  assert( pNa
c450: 6d 65 32 21 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me2!=0 || pName1
c460: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61  ==0 );.  if( pNa
c470: 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  me1==0 ){.    /*
c480: 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a   Form 1:  Analyz
c490: 65 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a  e everything */.
c4a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
c4b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
c4c0: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
c4d0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20  ontinue;  /* Do 
c4e0: 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20  not analyze the 
c4f0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
c500: 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61  .      analyzeDa
c510: 74 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69  tabase(pParse, i
c520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c530: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
c540: 30 20 26 26 20 28 69 44 62 20 3d 20 73 71 6c 69  0 && (iDb = sqli
c550: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
c560: 61 6d 65 31 29 29 3e 3d 30 20 29 7b 0a 20 20 20  ame1))>=0 ){.   
c570: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20   /* Analyze the 
c580: 73 63 68 65 6d 61 20 6e 61 6d 65 64 20 61 73 20  schema named as 
c590: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  the argument */.
c5a0: 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62      analyzeDatab
c5b0: 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ase(pParse, iDb)
c5c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
c5d0: 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a  * Form 3: Analyz
c5e0: 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  e the table or i
c5f0: 6e 64 65 78 20 6e 61 6d 65 64 20 61 73 20 61 6e  ndex named as an
c600: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 20   argument */.   
c610: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
c620: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
c630: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
c640: 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  , &pTableName);.
c650: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29      if( iDb>=0 )
c660: 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 70 4e  {.      zDb = pN
c670: 61 6d 65 32 2d 3e 6e 20 3f 20 64 62 2d 3e 61 44  ame2->n ? db->aD
c680: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
c690: 3a 20 30 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  : 0;.      z = s
c6a0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
c6b0: 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 4e 61  ken(db, pTableNa
c6c0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c6e0: 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46  (pIdx = sqlite3F
c6f0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
c700: 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  zDb))!=0 ){.    
c710: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
c720: 6c 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  le(pParse, pIdx-
c730: 3e 70 54 61 62 6c 65 2c 20 70 49 64 78 29 3b 0a  >pTable, pIdx);.
c740: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c750: 28 20 28 70 54 61 62 20 3d 20 73 71 6c 69 74 65  ( (pTab = sqlite
c760: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
c770: 72 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62 29 29  rse, 0, z, zDb))
c780: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
c790: 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50   analyzeTable(pP
c7a0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
c7b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c7d0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  db, z);.      }.
c7e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c7f0: 64 62 2d 3e 6e 53 71 6c 45 78 65 63 3d 3d 30 20  db->nSqlExec==0 
c800: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
c810: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
c820: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c830: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c840: 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 7d 0a 7d  P_Expire);.  }.}
c850: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
c860: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
c870: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
c880: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
c890: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
c8a0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
c8b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
c8c0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
c8d0: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
c8e0: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
c8f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c900: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
c910: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
c920: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
c930: 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  ument points to 
c940: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
c950: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
c960: 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  ng a.** list of 
c970: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
c980: 69 6e 74 65 67 65 72 73 2e 20 52 65 61 64 20 74  integers. Read t
c990: 68 65 20 66 69 72 73 74 20 6e 4f 75 74 20 6f 66  he first nOut of
c9a0: 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a 2a 20 74   these into.** t
c9b0: 68 65 20 61 72 72 61 79 20 61 4f 75 74 5b 5d 2e  he array aOut[].
c9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c9d0: 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a  decodeIntArray(.
c9e0: 20 20 63 68 61 72 20 2a 7a 49 6e 74 41 72 72 61    char *zIntArra
c9f0: 79 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69  y,       /* Stri
ca00: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e  ng containing in
ca10: 74 20 61 72 72 61 79 20 74 6f 20 64 65 63 6f 64  t array to decod
ca20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  e */.  int nOut,
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca40: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
ca50: 20 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f 0a 20 20   in aOut[] */.  
ca60: 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74 2c 20 20  tRowcnt *aOut,  
ca70: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
ca80: 69 6e 74 65 67 65 72 73 20 68 65 72 65 20 2a 2f  integers here */
ca90: 0a 20 20 4c 6f 67 45 73 74 20 2a 61 4c 6f 67 2c  .  LogEst *aLog,
caa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 2c            /* Or,
cab0: 20 69 66 20 61 4f 75 74 3d 3d 30 2c 20 68 65 72   if aOut==0, her
cac0: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
cad0: 6e 64 65 78 20 20 20 20 20 20 20 20 20 20 2f 2a  ndex          /*
cae0: 20 48 61 6e 64 6c 65 20 65 78 74 72 61 20 66 6c   Handle extra fl
caf0: 61 67 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ags for this ind
cb00: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
cb10: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20  */.){.  char *z 
cb20: 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20 20 69  = zIntArray;.  i
cb30: 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt c;.  int i;. 
cb40: 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 23 69 66   tRowcnt v;..#if
cb50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cb60: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
cb70: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20  .  if( z==0 ) z 
cb80: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 61 73  = "";.#else.  as
cb90: 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 23 65  sert( z!=0 );.#e
cba0: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
cbb0: 2a 7a 20 26 26 20 69 3c 6e 4f 75 74 3b 20 69 2b  *z && i<nOut; i+
cbc0: 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20  +){.    v = 0;. 
cbd0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30     while( (c=z[0
cbe0: 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39  ])>='0' && c<='9
cbf0: 27 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76  ' ){.      v = v
cc00: 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20  *10 + c - '0';. 
cc10: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
cc20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cc30: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
cc40: 41 54 34 0a 20 20 20 20 69 66 28 20 61 4f 75 74  AT4.    if( aOut
cc50: 20 29 20 61 4f 75 74 5b 69 5d 20 3d 20 76 3b 0a   ) aOut[i] = v;.
cc60: 20 20 20 20 69 66 28 20 61 4c 6f 67 20 29 20 61      if( aLog ) a
cc70: 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Log[i] = sqlite3
cc80: 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65 6c 73 65  LogEst(v);.#else
cc90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 75  .    assert( aOu
cca0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 55 4e 55 53  t==0 );.    UNUS
ccb0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 4f 75  ED_PARAMETER(aOu
ccc0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
ccd0: 61 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 61  aLog!=0 );.    a
cce0: 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Log[i] = sqlite3
ccf0: 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65 6e 64 69  LogEst(v);.#endi
cd00: 66 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20  f.    if( *z==' 
cd10: 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 23 69 66  ' ) z++;.  }.#if
cd20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
cd30: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
cd40: 34 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  4.  assert( pInd
cd50: 65 78 21 3d 30 20 29 3b 20 7b 0a 23 65 6c 73 65  ex!=0 ); {.#else
cd60: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
cd70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64  .#endif.    pInd
cd80: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
cd90: 20 30 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   0;.    pIndex->
cda0: 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20 30 3b 0a  noSkipScan = 0;.
cdb0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20      while( z[0] 
cdc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
cdd0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 75 6e  ite3_strglob("un
cde0: 6f 72 64 65 72 65 64 2a 22 2c 20 7a 29 3d 3d 30  ordered*", z)==0
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
ce00: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
ce10: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
ce20: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
ce30: 6c 6f 62 28 22 73 7a 3d 5b 30 2d 39 5d 2a 22 2c  lob("sz=[0-9]*",
ce40: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
ce50: 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49 64 78 52    pIndex->szIdxR
ce60: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
ce70: 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  st(sqlite3Atoi(z
ce80: 2b 33 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +3));.      }els
ce90: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
cea0: 72 67 6c 6f 62 28 22 6e 6f 73 6b 69 70 73 63 61  rglob("noskipsca
ceb0: 6e 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  n*", z)==0 ){.  
cec0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 6f        pIndex->no
ced0: 53 6b 69 70 53 63 61 6e 20 3d 20 31 3b 0a 20 20  SkipScan = 1;.  
cee0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
cef0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
cf00: 55 4c 54 0a 20 20 20 20 20 20 65 6c 73 65 20 69  ULT.      else i
cf10: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
cf20: 6f 62 28 22 63 6f 73 74 6d 75 6c 74 3d 5b 30 2d  ob("costmult=[0-
cf30: 39 5d 2a 22 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  9]*",z)==0 ){.  
cf40: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
cf50: 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 20 3d  able->costMult =
cf60: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
cf70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 2b 39 29 29  qlite3Atoi(z+9))
cf80: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
cf90: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  .      while( z[
cfa0: 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d 21 3d 27  0]!=0 && z[0]!='
cfb0: 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20   ' ) z++;.      
cfc0: 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27  while( z[0]==' '
cfd0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
cfe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
cff0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
d000: 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
d010: 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61  h index when rea
d020: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ding the.** sqli
d030: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20  te_stat1 table. 
d040: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76   .**.**     argv
d050: 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68  [0] = name of th
d060: 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 61  e table.**     a
d070: 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[1] = name of
d080: 20 74 68 65 20 69 6e 64 65 78 20 28 6d 69 67 68   the index (migh
d090: 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 20 20  t be NULL).**   
d0a0: 20 20 61 72 67 76 5b 32 5d 20 3d 20 72 65 73 75    argv[2] = resu
d0b0: 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73 69 73 20  lts of analysis 
d0c0: 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20 66 6f 72  - on integer for
d0d0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   each column.**.
d0e0: 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f 72 20 77  ** Entries for w
d0f0: 68 69 63 68 20 61 72 67 76 5b 31 5d 3d 3d 4e 55  hich argv[1]==NU
d100: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63 6f 72 64  LL simply record
d110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d120: 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61  ows in.** the ta
d130: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
d140: 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65  nt analysisLoade
d150: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  r(void *pData, i
d160: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
d170: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74  argv, char **Not
d180: 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69  Used){.  analysi
d190: 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28  sInfo *pInfo = (
d1a0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44  analysisInfo*)pD
d1b0: 61 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ata;.  Index *pI
d1c0: 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65 20 2a 70  ndex;.  Table *p
d1d0: 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  Table;.  const c
d1e0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
d1f0: 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20  t( argc==3 );.  
d200: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d210: 32 28 4e 6f 74 55 73 65 64 2c 20 61 72 67 63 29  2(NotUsed, argc)
d220: 3b 0a 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30  ;..  if( argv==0
d230: 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c   || argv[0]==0 |
d240: 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20 29 7b 0a  | argv[2]==0 ){.
d250: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d260: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
d270: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 49  ite3FindTable(pI
d280: 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d  nfo->db, argv[0]
d290: 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61  , pInfo->zDataba
d2a0: 73 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  se);.  if( pTabl
d2b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
d2c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
d2d0: 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  argv[1]==0 ){.  
d2e0: 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
d2f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
d300: 33 5f 73 74 72 69 63 6d 70 28 61 72 67 76 5b 30  3_stricmp(argv[0
d310: 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d 30 20 29 7b  ],argv[1])==0 ){
d320: 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71  .    pIndex = sq
d330: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
d340: 6e 64 65 78 28 70 54 61 62 6c 65 29 3b 0a 20 20  ndex(pTable);.  
d350: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
d360: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
d370: 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20  ndex(pInfo->db, 
d380: 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e  argv[1], pInfo->
d390: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 0a  zDatabase);.  }.
d3a0: 20 20 7a 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 0a    z = argv[2];..
d3b0: 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
d3c0: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 69 52      tRowcnt *aiR
d3d0: 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  owEst = 0;.    i
d3e0: 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nt nCol = pIndex
d3f0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b 0a 23 69 66  ->nKeyCol+1;.#if
d400: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d410: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
d420: 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69  .    /* Index.ai
d430: 52 6f 77 45 73 74 20 6d 61 79 20 61 6c 72 65 61  RowEst may alrea
d440: 64 79 20 62 65 20 73 65 74 20 68 65 72 65 20 69  dy be set here i
d450: 66 20 74 68 65 72 65 20 61 72 65 20 64 75 70 6c  f there are dupl
d460: 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 73 71  icate .    ** sq
d470: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 69  lite_stat1 entri
d480: 65 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  es for this inde
d490: 78 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  x. In that case 
d4a0: 6a 75 73 74 20 63 6c 6f 62 62 65 72 0a 20 20 20  just clobber.   
d4b0: 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64 61 74 61   ** the old data
d4c0: 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 69 6e   with the new in
d4d0: 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74  stead of allocat
d4e0: 69 6e 67 20 61 20 6e 65 77 20 61 72 72 61 79 2e  ing a new array.
d4f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 6e    */.    if( pIn
d500: 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3d 3d 30  dex->aiRowEst==0
d510: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
d520: 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 74 52  ->aiRowEst = (tR
d530: 6f 77 63 6e 74 2a 29 73 71 6c 69 74 65 33 4d 61  owcnt*)sqlite3Ma
d540: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
d550: 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 29  tRowcnt) * nCol)
d560: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  ;.      if( pInd
d570: 65 78 2d 3e 61 69 52 6f 77 45 73 74 3d 3d 30 20  ex->aiRowEst==0 
d580: 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c  ) sqlite3OomFaul
d590: 74 28 70 49 6e 66 6f 2d 3e 64 62 29 3b 0a 20 20  t(pInfo->db);.  
d5a0: 20 20 7d 0a 20 20 20 20 61 69 52 6f 77 45 73 74    }.    aiRowEst
d5b0: 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77   = pIndex->aiRow
d5c0: 45 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Est;.#endif.    
d5d0: 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
d5e0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 65 63 6f  ed = 0;.    deco
d5f0: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
d600: 2a 29 7a 2c 20 6e 43 6f 6c 2c 20 61 69 52 6f 77  *)z, nCol, aiRow
d610: 45 73 74 2c 20 70 49 6e 64 65 78 2d 3e 61 69 52  Est, pIndex->aiR
d620: 6f 77 4c 6f 67 45 73 74 2c 20 70 49 6e 64 65 78  owLogEst, pIndex
d630: 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 68  );.    pIndex->h
d640: 61 73 53 74 61 74 31 20 3d 20 31 3b 0a 20 20 20  asStat1 = 1;.   
d650: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 50 61   if( pIndex->pPa
d660: 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 7b  rtIdxWhere==0 ){
d670: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
d680: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 49 6e 64  RowLogEst = pInd
d690: 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  ex->aiRowLogEst[
d6a0: 30 5d 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  0];.      pTable
d6b0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
d6c0: 5f 48 61 73 53 74 61 74 31 3b 0a 20 20 20 20 7d  _HasStat1;.    }
d6d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
d6e0: 64 65 78 20 66 61 6b 65 49 64 78 3b 0a 20 20 20  dex fakeIdx;.   
d6f0: 20 66 61 6b 65 49 64 78 2e 73 7a 49 64 78 52 6f   fakeIdx.szIdxRo
d700: 77 20 3d 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61  w = pTable->szTa
d710: 62 52 6f 77 3b 0a 23 69 66 64 65 66 20 53 51 4c  bRow;.#ifdef SQL
d720: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
d730: 55 4c 54 0a 20 20 20 20 66 61 6b 65 49 64 78 2e  ULT.    fakeIdx.
d740: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
d750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 63 6f  .#endif.    deco
d760: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
d770: 2a 29 7a 2c 20 31 2c 20 30 2c 20 26 70 54 61 62  *)z, 1, 0, &pTab
d780: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 20  le->nRowLogEst, 
d790: 26 66 61 6b 65 49 64 78 29 3b 0a 20 20 20 20 70  &fakeIdx);.    p
d7a0: 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 20  Table->szTabRow 
d7b0: 3d 20 66 61 6b 65 49 64 78 2e 73 7a 49 64 78 52  = fakeIdx.szIdxR
d7c0: 6f 77 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  ow;.    pTable->
d7d0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
d7e0: 61 73 53 74 61 74 31 3b 0a 20 20 7d 0a 0a 20 20  asStat1;.  }..  
d7f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d800: 2a 2a 20 49 66 20 74 68 65 20 49 6e 64 65 78 2e  ** If the Index.
d810: 61 53 61 6d 70 6c 65 20 76 61 72 69 61 62 6c 65  aSample variable
d820: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65   is not NULL, de
d830: 6c 65 74 65 20 74 68 65 20 61 53 61 6d 70 6c 65  lete the aSample
d840: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20  [] array.** and 
d850: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f  its contents..*/
d860: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
d870: 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28  eteIndexSamples(
d880: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d890: 65 78 20 2a 70 49 64 78 29 7b 0a 23 69 66 64 65  ex *pIdx){.#ifde
d8a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d8b0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
d8c0: 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70   if( pIdx->aSamp
d8d0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  le ){.    int j;
d8e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
d8f0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a  pIdx->nSample; j
d900: 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  ++){.      Index
d910: 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49 64  Sample *p = &pId
d920: 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20  x->aSample[j];. 
d930: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
d940: 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a 20 20  ee(db, p->p);.  
d950: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
d960: 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e  bFree(db, pIdx->
d970: 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20 20  aSample);.  }.  
d980: 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e 70 6e  if( db && db->pn
d990: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b  BytesFreed==0 ){
d9a0: 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70  .    pIdx->nSamp
d9b0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  le = 0;.    pIdx
d9c0: 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20  ->aSample = 0;. 
d9d0: 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
d9e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
d9f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
da00: 54 45 52 28 70 49 64 78 29 3b 0a 23 65 6e 64 69  TER(pIdx);.#endi
da10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
da20: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
da30: 34 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66 20 53  4 */.}..#ifdef S
da40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
da50: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
da60: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
da70: 49 64 78 2d 3e 61 41 76 67 45 71 5b 5d 20 61 72  Idx->aAvgEq[] ar
da80: 72 61 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ray based on the
da90: 20 73 61 6d 70 6c 65 73 20 63 75 72 72 65 6e 74   samples current
daa0: 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ly.** stored in 
dab0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e  pIdx->aSample[].
dac0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
dad0: 20 69 6e 69 74 41 76 67 45 71 28 49 6e 64 65 78   initAvgEq(Index
dae0: 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70   *pIdx){.  if( p
daf0: 49 64 78 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  Idx ){.    Index
db00: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
db10: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
db20: 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  .    IndexSample
db30: 20 2a 70 46 69 6e 61 6c 20 3d 20 26 61 53 61 6d   *pFinal = &aSam
db40: 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ple[pIdx->nSampl
db50: 65 2d 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43  e-1];.    int iC
db60: 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c  ol;.    int nCol
db70: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 49   = 1;.    if( pI
db80: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3e 31  dx->nSampleCol>1
db90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
dba0: 74 68 69 73 20 69 73 20 73 74 61 74 34 20 64 61  this is stat4 da
dbb0: 74 61 2c 20 74 68 65 6e 20 63 61 6c 63 75 6c 61  ta, then calcula
dbc0: 74 65 20 61 41 76 67 45 71 5b 5d 20 76 61 6c 75  te aAvgEq[] valu
dbd0: 65 73 20 66 6f 72 20 61 6c 6c 0a 20 20 20 20 20  es for all.     
dbe0: 20 2a 2a 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d   ** sample colum
dbf0: 6e 73 20 65 78 63 65 70 74 20 74 68 65 20 6c 61  ns except the la
dc00: 73 74 2e 20 54 68 65 20 6c 61 73 74 20 69 73 20  st. The last is 
dc10: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 31 2c  always set to 1,
dc20: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63   as.      ** onc
dc30: 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 50  e the trailing P
dc40: 4b 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6e  K fields are con
dc50: 73 69 64 65 72 65 64 20 61 6c 6c 20 69 6e 64 65  sidered all inde
dc60: 78 20 6b 65 79 73 20 61 72 65 0a 20 20 20 20 20  x keys are.     
dc70: 20 2a 2a 20 75 6e 69 71 75 65 2e 20 20 2a 2f 0a   ** unique.  */.
dc80: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64        nCol = pId
dc90: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 2d 31 3b  x->nSampleCol-1;
dca0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41 76  .      pIdx->aAv
dcb0: 67 45 71 5b 6e 43 6f 6c 5d 20 3d 20 31 3b 0a 20  gEq[nCol] = 1;. 
dcc0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 43 6f     }.    for(iCo
dcd0: 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20  l=0; iCol<nCol; 
dce0: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
dcf0: 6e 74 20 6e 53 61 6d 70 6c 65 20 3d 20 70 49 64  nt nSample = pId
dd00: 78 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->nSample;.    
dd10: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
dd30: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
dd40: 68 72 6f 75 67 68 20 73 61 6d 70 6c 65 73 20 2a  hrough samples *
dd50: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
dd60: 73 75 6d 45 71 20 3d 20 30 3b 20 20 20 20 20 20  sumEq = 0;      
dd70: 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65 20    /* Sum of the 
dd80: 6e 45 71 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  nEq values */.  
dd90: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 76 67 45      tRowcnt avgE
dda0: 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 52 6f  q = 0;.      tRo
ddb0: 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20  wcnt nRow;      
ddc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ddd0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 69 6e 64 65   of rows in inde
dde0: 78 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 6e  x */.      i64 n
ddf0: 53 75 6d 31 30 30 20 3d 20 30 3b 20 20 20 20 20  Sum100 = 0;     
de00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
de10: 66 20 74 65 72 6d 73 20 63 6f 6e 74 72 69 62 75  f terms contribu
de20: 74 69 6e 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f  ting to sumEq */
de30: 0a 20 20 20 20 20 20 69 36 34 20 6e 44 69 73 74  .      i64 nDist
de40: 31 30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  100;            
de50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
de60: 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 69 6e  stinct values in
de70: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 20   index */..     
de80: 20 69 66 28 20 21 70 49 64 78 2d 3e 61 69 52 6f   if( !pIdx->aiRo
de90: 77 45 73 74 20 7c 7c 20 69 43 6f 6c 3e 3d 70 49  wEst || iCol>=pI
dea0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 70  dx->nKeyCol || p
deb0: 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43  Idx->aiRowEst[iC
dec0: 6f 6c 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ol+1]==0 ){.    
ded0: 20 20 20 20 6e 52 6f 77 20 3d 20 70 46 69 6e 61      nRow = pFina
dee0: 6c 2d 3e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  l->anLt[iCol];. 
def0: 20 20 20 20 20 20 20 6e 44 69 73 74 31 30 30 20         nDist100 
df00: 3d 20 28 69 36 34 29 31 30 30 20 2a 20 70 46 69  = (i64)100 * pFi
df10: 6e 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d  nal->anDLt[iCol]
df20: 3b 0a 20 20 20 20 20 20 20 20 6e 53 61 6d 70 6c  ;.        nSampl
df30: 65 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e--;.      }else
df40: 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d  {.        nRow =
df50: 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b   pIdx->aiRowEst[
df60: 30 5d 3b 0a 20 20 20 20 20 20 20 20 6e 44 69 73  0];.        nDis
df70: 74 31 30 30 20 3d 20 28 28 69 36 34 29 31 30 30  t100 = ((i64)100
df80: 20 2a 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   * pIdx->aiRowEs
df90: 74 5b 30 5d 29 20 2f 20 70 49 64 78 2d 3e 61 69  t[0]) / pIdx->ai
dfa0: 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31 5d 3b 0a  RowEst[iCol+1];.
dfb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
dfc0: 64 78 2d 3e 6e 52 6f 77 45 73 74 30 20 3d 20 6e  dx->nRowEst0 = n
dfd0: 52 6f 77 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  Row;..      /* S
dfe0: 65 74 20 6e 53 75 6d 20 74 6f 20 74 68 65 20 6e  et nSum to the n
dff0: 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
e000: 74 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  t (iCol+1) field
e010: 20 70 72 65 66 69 78 65 73 20 74 68 61 74 0a 20   prefixes that. 
e020: 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 69 6e       ** occur in
e030: 20 74 68 65 20 73 74 61 74 34 20 74 61 62 6c 65   the stat4 table
e040: 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e   for this index.
e050: 20 53 65 74 20 73 75 6d 45 71 20 74 6f 20 74 68   Set sumEq to th
e060: 65 20 73 75 6d 20 6f 66 20 0a 20 20 20 20 20 20  e sum of .      
e070: 2a 2a 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  ** the nEq value
e080: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
e090: 6c 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 73  l for the same s
e0a0: 65 74 20 28 61 64 64 69 6e 67 20 74 68 65 20 76  et (adding the v
e0b0: 61 6c 75 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  alue .      ** o
e0c0: 6e 6c 79 20 6f 6e 63 65 20 77 68 65 72 65 20 74  nly once where t
e0d0: 68 65 72 65 20 65 78 69 73 74 20 64 75 70 6c 69  here exist dupli
e0e0: 63 61 74 65 20 70 72 65 66 69 78 65 73 29 2e 20  cate prefixes). 
e0f0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
e100: 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b  0; i<nSample; i+
e110: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e120: 69 3d 3d 28 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  i==(pIdx->nSampl
e130: 65 2d 31 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  e-1).         ||
e140: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c   aSample[i].anDL
e150: 74 5b 69 43 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65  t[iCol]!=aSample
e160: 5b 69 2b 31 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c  [i+1].anDLt[iCol
e170: 5d 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ] .        ){.  
e180: 20 20 20 20 20 20 20 20 73 75 6d 45 71 20 2b 3d          sumEq +=
e190: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
e1a0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
e1b0: 20 20 6e 53 75 6d 31 30 30 20 2b 3d 20 31 30 30    nSum100 += 100
e1c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e1d0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
e1e0: 44 69 73 74 31 30 30 3e 6e 53 75 6d 31 30 30 20  Dist100>nSum100 
e1f0: 26 26 20 73 75 6d 45 71 3c 6e 52 6f 77 20 29 7b  && sumEq<nRow ){
e200: 0a 20 20 20 20 20 20 20 20 61 76 67 45 71 20 3d  .        avgEq =
e210: 20 28 28 69 36 34 29 31 30 30 20 2a 20 28 6e 52   ((i64)100 * (nR
e220: 6f 77 20 2d 20 73 75 6d 45 71 29 29 2f 28 6e 44  ow - sumEq))/(nD
e230: 69 73 74 31 30 30 20 2d 20 6e 53 75 6d 31 30 30  ist100 - nSum100
e240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e250: 20 69 66 28 20 61 76 67 45 71 3d 3d 30 20 29 20   if( avgEq==0 ) 
e260: 61 76 67 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  avgEq = 1;.     
e270: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
e280: 6f 6c 5d 20 3d 20 61 76 67 45 71 3b 0a 20 20 20  ol] = avgEq;.   
e290: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e2a0: 4c 6f 6f 6b 20 75 70 20 61 6e 20 69 6e 64 65 78  Look up an index
e2b0: 20 62 79 20 6e 61 6d 65 2e 20 20 4f 72 2c 20 69   by name.  Or, i
e2c0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  f the name of a 
e2d0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
e2e0: 62 6c 65 0a 2a 2a 20 69 73 20 73 75 70 70 6c 69  ble.** is suppli
e2f0: 65 64 20 69 6e 73 74 65 61 64 2c 20 66 69 6e 64  ed instead, find
e300: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e310: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20   index for that 
e320: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
e330: 20 49 6e 64 65 78 20 2a 66 69 6e 64 49 6e 64 65   Index *findInde
e340: 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  xOrPrimaryKey(. 
e350: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e370: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
e380: 2a 7a 44 62 0a 29 7b 0a 20 20 49 6e 64 65 78 20  *zDb.){.  Index 
e390: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46  *pIdx = sqlite3F
e3a0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
e3b0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  me, zDb);.  if( 
e3c0: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 54  pIdx==0 ){.    T
e3d0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e3e0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
e3f0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
e400: 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21     if( pTab && !
e410: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
e420: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 50   pIdx = sqlite3P
e430: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
e440: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Tab);.  }.  retu
e450: 72 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pIdx;.}../*.*
e460: 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  * Load the conte
e470: 6e 74 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  nt from either t
e480: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  he sqlite_stat4 
e490: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
e4a0: 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f 20 74  table .** into t
e4b0: 68 65 20 72 65 6c 65 76 61 6e 74 20 49 6e 64 65  he relevant Inde
e4c0: 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  x.aSample[] arra
e4d0: 79 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  ys..**.** Argume
e4e0: 6e 74 73 20 7a 53 71 6c 31 20 61 6e 64 20 7a 53  nts zSql1 and zS
e4f0: 71 6c 32 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ql2 must point t
e500: 6f 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  o SQL statements
e510: 20 74 68 61 74 20 72 65 74 75 72 6e 0a 2a 2a 20   that return.** 
e520: 64 61 74 61 20 65 71 75 69 76 61 6c 65 6e 74 20  data equivalent 
e530: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
e540: 20 28 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65   (statements are
e550: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 73   different for s
e560: 74 61 74 33 2c 0a 2a 2a 20 73 65 65 20 74 68 65  tat3,.** see the
e570: 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
e580: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74  function for det
e590: 61 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ails):.**.**    
e5a0: 7a 53 71 6c 31 3a 20 53 45 4c 45 43 54 20 69 64  zSql1: SELECT id
e5b0: 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  x,count(*) FROM 
e5c0: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20  %Q.sqlite_stat4 
e5d0: 47 52 4f 55 50 20 42 59 20 69 64 78 0a 2a 2a 20  GROUP BY idx.** 
e5e0: 20 20 20 7a 53 71 6c 32 3a 20 53 45 4c 45 43 54     zSql2: SELECT
e5f0: 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c   idx,neq,nlt,ndl
e600: 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51  t,sample FROM %Q
e610: 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2a  .sqlite_stat4.**
e620: 0a 2a 2a 20 77 68 65 72 65 20 25 51 20 69 73 20  .** where %Q is 
e630: 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68  replaced with th
e640: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
e650: 62 65 66 6f 72 65 20 74 68 65 20 53 51 4c 20 69  before the SQL i
e660: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
e670: 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74  tatic int loadSt
e680: 61 74 54 62 6c 28 0a 20 20 73 71 6c 69 74 65 33  atTbl(.  sqlite3
e690: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e6a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
e6b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
e6c0: 6e 74 20 62 53 74 61 74 33 2c 20 20 20 20 20 20  nt bStat3,      
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6e0: 41 73 73 75 6d 65 20 73 69 6e 67 6c 65 20 63 6f  Assume single co
e6f0: 6c 75 6d 6e 20 72 65 63 6f 72 64 73 20 6f 6e 6c  lumn records onl
e700: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
e710: 72 20 2a 7a 53 71 6c 31 2c 20 20 20 20 20 20 20  r *zSql1,       
e720: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
e730: 65 6d 65 6e 74 20 31 20 28 73 65 65 20 61 62 6f  ement 1 (see abo
e740: 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ve) */.  const c
e750: 68 61 72 20 2a 7a 53 71 6c 32 2c 20 20 20 20 20  har *zSql2,     
e760: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
e770: 61 74 65 6d 65 6e 74 20 32 20 28 73 65 65 20 61  atement 2 (see a
e780: 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  bove) */.  const
e790: 20 63 68 61 72 20 2a 7a 44 62 20 20 20 20 20 20   char *zDb      
e7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e7b0: 62 61 73 65 20 6e 61 6d 65 20 28 65 2e 67 2e 20  base name (e.g. 
e7c0: 22 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a 20 20  "main") */.){.  
e7d0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7f0: 20 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72   Result codes fr
e800: 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
e810: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
e820: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
e830: 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
e840: 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 75 6e 20  ement being run 
e850: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
e880: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
e890: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 65  */.  Index *pPre
e8a0: 76 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  vIdx = 0;       
e8b0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 69     /* Previous i
e8c0: 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70  ndex in the loop
e8d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c   */.  IndexSampl
e8e0: 65 20 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20 20  e *pSample;     
e8f0: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69 6e      /* A slot in
e900: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d   pIdx->aSample[]
e910: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64   */..  assert( d
e920: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
e930: 73 61 62 6c 65 20 29 3b 0a 20 20 7a 53 71 6c 20  sable );.  zSql 
e940: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e950: 28 64 62 2c 20 7a 53 71 6c 31 2c 20 7a 44 62 29  (db, zSql1, zDb)
e960: 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b  ;.  if( !zSql ){
e970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e980: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e990: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
e9a0: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
e9b0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
e9c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
e9d0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
e9e0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e9f0: 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73   rc;..  while( s
ea00: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
ea10: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
ea20: 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 43 6f  {.    int nIdxCo
ea30: 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
ea40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ea50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 74 61 74   columns in stat
ea60: 34 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 20 20  4 records */..  
ea70: 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20    char *zIndex; 
ea80: 20 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20    /* Index name 
ea90: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
eaa0: 64 78 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  dx;    /* Pointe
eab0: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  r to the index o
eac0: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
ead0: 20 6e 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20   nSample;    /* 
eae0: 4e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  Number of sample
eaf0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  s */.    int nBy
eb00: 74 65 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65  te;      /* Byte
eb10: 73 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69  s of space requi
eb20: 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  red */.    int i
eb30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
eb40: 74 65 73 20 6f 66 20 73 70 61 63 65 20 72 65 71  tes of space req
eb50: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f  uired */.    tRo
eb60: 77 63 6e 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20  wcnt *pSpace;.. 
eb70: 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61     zIndex = (cha
eb80: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
eb90: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
eba0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65  );.    if( zInde
ebb0: 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  x==0 ) continue;
ebc0: 0a 20 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73  .    nSample = s
ebd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
ebe0: 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
ebf0: 20 70 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65   pIdx = findInde
ec00: 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62  xOrPrimaryKey(db
ec10: 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a  , zIndex, zDb);.
ec20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
ec30: 3d 3d 30 20 7c 7c 20 62 53 74 61 74 33 20 7c 7c  ==0 || bStat3 ||
ec40: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d   pIdx->nSample==
ec50: 30 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 64 65  0 );.    /* Inde
ec60: 78 2e 6e 53 61 6d 70 6c 65 20 69 73 20 6e 6f 6e  x.nSample is non
ec70: 2d 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f  -zero at this po
ec80: 69 6e 74 20 69 66 20 64 61 74 61 20 68 61 73 20  int if data has 
ec90: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
eca0: 20 2a 2a 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   ** loaded from 
ecb0: 74 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e  the stat4 table.
ecc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 67   In this case ig
ecd0: 6e 6f 72 65 20 73 74 61 74 33 20 64 61 74 61 2e  nore stat3 data.
ece0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64    */.    if( pId
ecf0: 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 6e 53  x==0 || pIdx->nS
ed00: 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  ample ) continue
ed10: 3b 0a 20 20 20 20 69 66 28 20 62 53 74 61 74 33  ;.    if( bStat3
ed20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
ed30: 65 72 74 28 20 21 48 61 73 52 6f 77 69 64 28 70  ert( !HasRowid(p
ed40: 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 7c 7c 20  Idx->pTable) || 
ed50: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 70  pIdx->nColumn==p
ed60: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 20 29  Idx->nKeyCol+1 )
ed70: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
ed80: 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
ed90: 6c 65 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  le) && IsPrimary
eda0: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
edb0: 7b 0a 20 20 20 20 20 20 20 20 6e 49 64 78 43 6f  {.        nIdxCo
edc0: 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l = pIdx->nKeyCo
edd0: 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
ede0: 20 20 20 20 20 20 20 20 6e 49 64 78 43 6f 6c 20          nIdxCol 
edf0: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
ee00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ee10: 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65     pIdx->nSample
ee20: 43 6f 6c 20 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20  Col = nIdxCol;. 
ee30: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
ee40: 66 28 49 6e 64 65 78 53 61 6d 70 6c 65 29 20 2a  f(IndexSample) *
ee50: 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42   nSample;.    nB
ee60: 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52  yte += sizeof(tR
ee70: 6f 77 63 6e 74 29 20 2a 20 6e 49 64 78 43 6f 6c  owcnt) * nIdxCol
ee80: 20 2a 20 33 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a   * 3 * nSample;.
ee90: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 49 64      nByte += nId
eea0: 78 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 74 52  xCol * sizeof(tR
eeb0: 6f 77 63 6e 74 29 3b 20 20 20 20 20 2f 2a 20 53  owcnt);     /* S
eec0: 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 2e 61  pace for Index.a
eed0: 41 76 67 45 71 5b 5d 20 2a 2f 0a 0a 20 20 20 20  AvgEq[] */..    
eee0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20  pIdx->aSample = 
eef0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ef00: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
ef10: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
ef20: 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ample==0 ){.    
ef30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
ef40: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
ef50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ef60: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
ef70: 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20 28 74  .    pSpace = (t
ef80: 52 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61  Rowcnt*)&pIdx->a
ef90: 53 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b  Sample[nSample];
efa0: 0a 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45  .    pIdx->aAvgE
efb0: 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61  q = pSpace; pSpa
efc0: 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20  ce += nIdxCol;. 
efd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
efe0: 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
eff0: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
f000: 5b 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61 63  [i].anEq = pSpac
f010: 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64  e; pSpace += nId
f020: 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78  xCol;.      pIdx
f030: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  ->aSample[i].anL
f040: 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61  t = pSpace; pSpa
f050: 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20  ce += nIdxCol;. 
f060: 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70       pIdx->aSamp
f070: 6c 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53  le[i].anDLt = pS
f080: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
f090: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20  nIdxCol;.    }. 
f0a0: 20 20 20 61 73 73 65 72 74 28 20 28 28 75 38 2a     assert( ((u8*
f0b0: 29 70 53 70 61 63 65 29 2d 6e 42 79 74 65 3d 3d  )pSpace)-nByte==
f0c0: 28 75 38 2a 29 28 70 49 64 78 2d 3e 61 53 61 6d  (u8*)(pIdx->aSam
f0d0: 70 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63  ple) );.  }.  rc
f0e0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
f0f0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
f100: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
f110: 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
f120: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  te3MPrintf(db, z
f130: 53 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69 66  Sql2, zDb);.  if
f140: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72  ( !zSql ){.    r
f150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f160: 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
f170: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
f180: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  are(db, zSql, -1
f190: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
f1a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f1b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  , zSql);.  if( r
f1c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
f1d0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
f1e0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
f1f0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
f200: 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20  char *zIndex;   
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20   Index name */. 
f230: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
f260: 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  he index object 
f270: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  */.    int nCol 
f280: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
f290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f2a0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
f2b0: 65 78 20 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65  ex */..    zInde
f2c0: 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  x = (char *)sqli
f2d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
f2e0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
f2f0: 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63  f( zIndex==0 ) c
f300: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
f310: 78 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50  x = findIndexOrP
f320: 72 69 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49  rimaryKey(db, zI
f330: 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ndex, zDb);.    
f340: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f  if( pIdx==0 ) co
f350: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
f360: 68 69 73 20 6e 65 78 74 20 63 6f 6e 64 69 74 69  his next conditi
f370: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 64 61  on is true if da
f380: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
f390: 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20  een loaded from 
f3a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  .    ** the sqli
f3b0: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20  te_stat4 table. 
f3c0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e  In this case ign
f3d0: 6f 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20  ore stat3 data. 
f3e0: 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   */.    nCol = p
f3f0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3b  Idx->nSampleCol;
f400: 0a 20 20 20 20 69 66 28 20 62 53 74 61 74 33 20  .    if( bStat3 
f410: 26 26 20 6e 43 6f 6c 3e 31 20 29 20 63 6f 6e 74  && nCol>1 ) cont
f420: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
f430: 64 78 21 3d 70 50 72 65 76 49 64 78 20 29 7b 0a  dx!=pPrevIdx ){.
f440: 20 20 20 20 20 20 69 6e 69 74 41 76 67 45 71 28        initAvgEq(
f450: 70 50 72 65 76 49 64 78 29 3b 0a 20 20 20 20 20  pPrevIdx);.     
f460: 20 70 50 72 65 76 49 64 78 20 3d 20 70 49 64 78   pPrevIdx = pIdx
f470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 61 6d  ;.    }.    pSam
f480: 70 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61 53 61  ple = &pIdx->aSa
f490: 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70  mple[pIdx->nSamp
f4a0: 6c 65 5d 3b 0a 20 20 20 20 64 65 63 6f 64 65 49  le];.    decodeI
f4b0: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73  ntArray((char*)s
f4c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
f4d0: 78 74 28 70 53 74 6d 74 2c 31 29 2c 6e 43 6f 6c  xt(pStmt,1),nCol
f4e0: 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c 30  ,pSample->anEq,0
f4f0: 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49  ,0);.    decodeI
f500: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73  ntArray((char*)s
f510: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
f520: 78 74 28 70 53 74 6d 74 2c 32 29 2c 6e 43 6f 6c  xt(pStmt,2),nCol
f530: 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 2c 30  ,pSample->anLt,0
f540: 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49  ,0);.    decodeI
f550: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73  ntArray((char*)s
f560: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
f570: 78 74 28 70 53 74 6d 74 2c 33 29 2c 6e 43 6f 6c  xt(pStmt,3),nCol
f580: 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 2c  ,pSample->anDLt,
f590: 30 2c 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 61  0,0);..    /* Ta
f5a0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
f5b0: 20 73 61 6d 70 6c 65 2e 20 41 64 64 20 74 77 6f   sample. Add two
f5c0: 20 30 78 30 30 20 62 79 74 65 73 20 74 68 65 20   0x00 bytes the 
f5d0: 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
f5e0: 72 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  r..    ** This i
f5f0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 61  s in case the sa
f600: 6d 70 6c 65 20 72 65 63 6f 72 64 20 69 73 20 63  mple record is c
f610: 6f 72 72 75 70 74 65 64 2e 20 49 6e 20 74 68 61  orrupted. In tha
f620: 74 20 63 61 73 65 2c 20 74 68 65 0a 20 20 20 20  t case, the.    
f630: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
f640: 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 6d 61  cordCompare() ma
f650: 79 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  y read up to two
f660: 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
f670: 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
f680: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 75  the allocated bu
f690: 66 66 65 72 20 62 65 66 6f 72 65 20 69 74 20 72  ffer before it r
f6a0: 65 61 6c 69 7a 65 73 20 69 74 20 69 73 20 64 65  ealizes it is de
f6b0: 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 20 20 2a  aling with.    *
f6c0: 2a 20 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f  * a corrupt reco
f6d0: 72 64 2e 20 41 64 64 69 6e 67 20 74 68 65 20 74  rd. Adding the t
f6e0: 77 6f 20 30 78 30 30 20 62 79 74 65 73 20 70 72  wo 0x00 bytes pr
f6f0: 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
f700: 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20   causing.    ** 
f710: 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
f720: 64 2e 20 20 2a 2f 0a 20 20 20 20 70 53 61 6d 70  d.  */.    pSamp
f730: 6c 65 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f  le->n = sqlite3_
f740: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
f750: 6d 74 2c 20 34 29 3b 0a 20 20 20 20 70 53 61 6d  mt, 4);.    pSam
f760: 70 6c 65 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33  ple->p = sqlite3
f770: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f780: 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 2b 20 32 29   pSample->n + 2)
f790: 3b 0a 20 20 20 20 69 66 28 20 70 53 61 6d 70 6c  ;.    if( pSampl
f7a0: 65 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e->p==0 ){.     
f7b0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
f7c0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
f7d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
f7e0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
f7f0: 20 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d      if( pSample-
f800: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  >n ){.      memc
f810: 70 79 28 70 53 61 6d 70 6c 65 2d 3e 70 2c 20 73  py(pSample->p, s
f820: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
f830: 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 70 53  ob(pStmt, 4), pS
f840: 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d  ample->n);.    }
f850: 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70  .    pIdx->nSamp
f860: 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  le++;.  }.  rc =
f870: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
f880: 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
f890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
f8a0: 69 6e 69 74 41 76 67 45 71 28 70 50 72 65 76 49  initAvgEq(pPrevI
f8b0: 64 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  dx);.  return rc
f8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
f8d0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
f8e0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 6e   sqlite_stat4 an
f8f0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  d sqlite_stat3 t
f900: 61 62 6c 65 73 20 69 6e 74 6f 20 0a 2a 2a 20 74  ables into .** t
f910: 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65  he Index.aSample
f920: 5b 5d 20 61 72 72 61 79 73 20 6f 66 20 61 6c 6c  [] arrays of all
f930: 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61   indices..*/.sta
f940: 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61 74  tic int loadStat
f950: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  4(sqlite3 *db, c
f960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
f970: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f980: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f990: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
f9a0: 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  es from subrouti
f9b0: 6e 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nes */..  assert
f9c0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
f9d0: 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 69 66  bDisable );.  if
f9e0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
f9f0: 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
fa00: 74 61 74 34 22 2c 20 7a 44 62 29 20 29 7b 0a 20  tat4", zDb) ){. 
fa10: 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74     rc = loadStat
fa20: 54 62 6c 28 64 62 2c 20 30 2c 0a 20 20 20 20 20  Tbl(db, 0,.     
fa30: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75   "SELECT idx,cou
fa40: 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71  nt(*) FROM %Q.sq
fa50: 6c 69 74 65 5f 73 74 61 74 34 20 47 52 4f 55 50  lite_stat4 GROUP
fa60: 20 42 59 20 69 64 78 22 2c 20 0a 20 20 20 20 20   BY idx", .     
fa70: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71   "SELECT idx,neq
fa80: 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65  ,nlt,ndlt,sample
fa90: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
faa0: 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20 7a 44  stat4",.      zD
fab0: 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  b.    );.  }..  
fac0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fad0: 4b 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64  K && sqlite3Find
fae0: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
faf0: 65 5f 73 74 61 74 33 22 2c 20 7a 44 62 29 20 29  e_stat3", zDb) )
fb00: 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53  {.    rc = loadS
fb10: 74 61 74 54 62 6c 28 64 62 2c 20 31 2c 0a 20 20  tatTbl(db, 1,.  
fb20: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c      "SELECT idx,
fb30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51  count(*) FROM %Q
fb40: 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 20 47 52  .sqlite_stat3 GR
fb50: 4f 55 50 20 42 59 20 69 64 78 22 2c 20 0a 20 20  OUP BY idx", .  
fb60: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c      "SELECT idx,
fb70: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 71 6c  neq,nlt,ndlt,sql
fb80: 69 74 65 5f 72 65 63 6f 72 64 28 73 61 6d 70 6c  ite_record(sampl
fb90: 65 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  e) FROM %Q.sqlit
fba0: 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20 20  e_stat3",.      
fbb0: 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  zDb.    );.  }..
fbc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
fbd0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fbe0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
fbf0: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
fc00: 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Load the content
fc10: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
fc20: 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f  tat1 and sqlite_
fc30: 73 74 61 74 33 2f 34 20 74 61 62 6c 65 73 2e 20  stat3/4 tables. 
fc40: 54 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  The.** contents 
fc50: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  of sqlite_stat1 
fc60: 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75  are used to popu
fc70: 6c 61 74 65 20 74 68 65 20 49 6e 64 65 78 2e 61  late the Index.a
fc80: 69 52 6f 77 45 73 74 5b 5d 0a 2a 2a 20 61 72 72  iRowEst[].** arr
fc90: 61 79 73 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74  ays. The content
fca0: 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  s of sqlite_stat
fcb0: 33 2f 34 20 61 72 65 20 75 73 65 64 20 74 6f 20  3/4 are used to 
fcc0: 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
fcd0: 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20  Index.aSample[] 
fce0: 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  arrays..**.** If
fcf0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
fd00: 31 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70  1 table is not p
fd10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
fd20: 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  tabase, SQLITE_E
fd30: 52 52 4f 52 0a 2a 2a 20 69 73 20 72 65 74 75 72  RROR.** is retur
fd40: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
fd50: 65 2c 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54  e, even if SQLIT
fd60: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34  E_ENABLE_STAT3/4
fd70: 20 77 61 73 20 64 65 66 69 6e 65 64 20 0a 2a 2a   was defined .**
fd80: 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74   during compilat
fd90: 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ion and the sqli
fda0: 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62 6c 65  te_stat3/4 table
fdb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20   is present, no 
fdc0: 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65 61 64  data is .** read
fdd0: 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20   from it..**.** 
fde0: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
fdf0: 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64 65 66  _STAT3/4 was def
fe00: 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f 6d 70  ined during comp
fe10: 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  ilation and the 
fe20: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34  .** sqlite_stat4
fe30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72   table is not pr
fe40: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
fe50: 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52  abase, SQLITE_ER
fe60: 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ROR is.** return
fe70: 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20  ed. However, in 
fe80: 74 68 69 73 20 63 61 73 65 2c 20 64 61 74 61 20  this case, data 
fe90: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
fea0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a 2a   sqlite_stat1.**
feb0: 20 74 61 62 6c 65 20 28 69 66 20 69 74 20 69 73   table (if it is
fec0: 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f 72 65   present) before
fed0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
fee0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
fef0: 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66  r occurs, this f
ff00: 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
ff10: 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ets db->mallocFa
ff20: 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65  iled..** This me
ff30: 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c 6c 65  ans if the calle
ff40: 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72 65 20  r does not care 
ff50: 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72 72 6f  about other erro
ff60: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 0a 2a  rs, the return.*
ff70: 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20 69 67  * code may be ig
ff80: 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
ff90: 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61  lite3AnalysisLoa
ffa0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
ffb0: 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79  nt iDb){.  analy
ffc0: 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20  sisInfo sInfo;. 
ffd0: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
ffe0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
fff0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10000 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  ;.  Schema *pSch
10010 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
10020 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 61  b].pSchema;..  a
10030 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
10040 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
10050 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
10060 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b  b[iDb].pBt!=0 );
10070 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79  ..  /* Clear any
10080 20 70 72 69 6f 72 20 73 74 61 74 69 73 74 69 63   prior statistic
10090 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  s */.  assert( s
100a0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
100b0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
100c0 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ) );.  for(i=sql
100d0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
100e0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
100f0 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
10100 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
10110 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
10120 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
10130 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
10140 73 20 26 3d 20 7e 54 46 5f 48 61 73 53 74 61 74  s &= ~TF_HasStat
10150 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73  1;.  }.  for(i=s
10160 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
10170 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
10180 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
10190 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
101a0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
101b0 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
101c0 0a 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74  .    pIdx->hasSt
101d0 61 74 31 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  at1 = 0;.#ifdef 
101e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
101f0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
10200 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
10210 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
10220 49 64 78 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  Idx);.    pIdx->
10230 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6e  aSample = 0;.#en
10240 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  dif.  }..  /* Lo
10250 61 64 20 6e 65 77 20 73 74 61 74 69 73 74 69 63  ad new statistic
10260 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 71 6c  s out of the sql
10270 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
10280 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20  */.  sInfo.db = 
10290 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74  db;.  sInfo.zDat
102a0 61 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b  abase = db->aDb[
102b0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
102c0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
102d0 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
102e0 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
102f0 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b  zDatabase)!=0 ){
10300 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
10310 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
10320 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10330 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52 4f  tbl,idx,stat FRO
10340 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
10350 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  1", sInfo.zDatab
10360 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ase);.    if( zS
10370 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
10380 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10390 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
103a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
103b0 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
103c0 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  ql, analysisLoad
103d0 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a  er, &sInfo, 0);.
103e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
103f0 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
10400 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
10410 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  et appropriate d
10420 65 66 61 75 6c 74 73 20 6f 6e 20 61 6c 6c 20 69  efaults on all i
10430 6e 64 65 78 65 73 20 6e 6f 74 20 69 6e 20 74 68  ndexes not in th
10440 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
10450 61 62 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  able */.  assert
10460 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10470 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
10480 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  , 0) );.  for(i=
10490 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
104a0 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
104b0 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
104c0 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
104d0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
104e0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
104f0 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 2d  ;.    if( !pIdx-
10500 3e 68 61 73 53 74 61 74 31 20 29 20 73 71 6c 69  >hasStat1 ) sqli
10510 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
10520 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
10530 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74 69  * Load the stati
10540 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73  stics from the s
10550 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
10560 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e. */.#ifdef SQL
10570 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
10580 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
10590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
105a0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
105b0 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20  de.bDisable++;. 
105c0 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74     rc = loadStat
105d0 34 28 64 62 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  4(db, sInfo.zDat
105e0 61 62 61 73 65 29 3b 0a 20 20 20 20 64 62 2d 3e  abase);.    db->
105f0 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
10600 6c 65 2d 2d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  le--;.  }.  for(
10610 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
10620 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
10630 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
10640 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
10650 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
10660 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
10670 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  i);.    sqlite3_
10680 66 72 65 65 28 70 49 64 78 2d 3e 61 69 52 6f 77  free(pIdx->aiRow
10690 45 73 74 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  Est);.    pIdx->
106a0 61 69 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20  aiRowEst = 0;.  
106b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
106c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
106d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
106e0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
106f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10700 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
10710 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20  TE_OMIT_ANALYZE 
10720 2a 2f 0a                                         */.