/ Hex Artifact Content
Login

Artifact b4857ec5b46b66049e5a3cec53c071c4902a8e8b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
26e0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
26f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
2700: 2e 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a  .%s(%s)", pDb->z
2710: 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61  DbSName, zTab, a
2720: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20  Table[i].zCols. 
2730: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2740: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
2750: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
2760: 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c        aCreateTbl
2770: 5b 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49  [i] = OPFLAG_P2I
2780: 53 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SREG;.      }.  
2790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
27b0: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
27c0: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
27d0: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
27e0: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
27f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2800: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2810: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
2820: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
2830: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
2840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2850: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
2860: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
2870: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43  ->tnum;.      aC
2880: 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b  reateTbl[i] = 0;
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
28a0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
28b0: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
28c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
28d0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
28f0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2900: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
2920: 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
2930: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
2940: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65  Name, zTab, zWhe
2950: 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20  reType, zWhere. 
2960: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2980: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
2990: 74 5b 31 33 34 5d 20 74 61 62 6c 65 20 61 6c 72  t[134] table alr
29a0: 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 44 65  eady exists.  De
29b0: 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e 20 2a  lete all rows. *
29c0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
29d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29e0: 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f 74 5b 69  P_Clear, aRoot[i
29f0: 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  ], iDb);.      }
2a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2a10: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
2a20: 5f 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65  _stat[134] table
2a30: 73 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  s for writing. *
2a40: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 54 61  /.  for(i=0; aTa
2a50: 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b 20 69 2b  ble[i].zCols; i+
2a60: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2a70: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 61 62  i<ArraySize(aTab
2a80: 6c 65 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  le) );.    sqlit
2a90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2aa0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
2ab0: 20 69 53 74 61 74 43 75 72 2b 69 2c 20 61 52 6f   iStatCur+i, aRo
2ac0: 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33 29 3b 0a  ot[i], iDb, 3);.
2ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ae0: 68 61 6e 67 65 50 35 28 76 2c 20 61 43 72 65 61  hangeP5(v, aCrea
2af0: 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 56  teTbl[i]);.    V
2b00: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 61  dbeComment((v, a
2b10: 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 29  Table[i].zName))
2b20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2b30: 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65  ecommended numbe
2b40: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72  r of samples for
2b50: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f   sqlite_stat4.*/
2b60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b70: 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20  STAT4_SAMPLES.# 
2b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54  define SQLITE_ST
2b90: 41 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23  AT4_SAMPLES 24.#
2ba0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72  endif../*.** Thr
2bb0: 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ee SQL functions
2bc0: 20 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20   - stat_init(), 
2bd0: 73 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64  stat_push(), and
2be0: 20 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a   stat_get() -.**
2bf0: 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e   share an instan
2c00: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c10: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f  ing structure to
2c20: 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74   hold their stat
2c30: 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  e.** information
2c40: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c50: 75 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53  uct Stat4Accum S
2c60: 74 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64  tat4Accum;.typed
2c70: 65 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53  ef struct Stat4S
2c80: 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c  ample Stat4Sampl
2c90: 65 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53  e;.struct Stat4S
2ca0: 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e  ample {.  tRowcn
2cb0: 74 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20  t *anEq;        
2cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2cd0: 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f  ite_stat4.nEq */
2ce0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c  .  tRowcnt *anDL
2cf0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d00: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2d10: 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65  t4.nDLt */.#ifde
2d20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d30: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2d40: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20   tRowcnt *anLt; 
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2d70: 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  .nLt */.  union 
2d80: 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2da0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
2db0: 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20  n main table of 
2dc0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75  the key */.    u
2dd0: 38 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20  8 *aRowid;      
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2df0: 2a 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55  * Key for WITHOU
2e00: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
2e10: 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e  /.  } u;.  u32 n
2e20: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e40: 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f  zeof aRowid[] */
2e50: 0a 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b  .  u8 isPSample;
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2e80: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20  periodic sample 
2e90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53       /* If !isPS
2ec0: 61 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f  ample, the reaso
2ed0: 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20  n for inclusion 
2ee0: 2a 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20  */.  u32 iHash; 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b       /* Tiebreak
2f10: 65 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69  er hash */.#endi
2f20: 66 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  f.};            
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20          .struct 
2f60: 53 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74  Stat4Accum {.  t
2f70: 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20  Rowcnt nRow;    
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f90: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2fa0: 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
2fb0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61  /.  tRowcnt nPSa
2fc0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  mple;         /*
2fd0: 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f   How often to do
2fe0: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2ff0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3020: 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20  olumns in index 
3030: 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20  + pk/rowid */.  
3040: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
3050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3060: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
3070: 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20 70 6b 2f  umns w/o the pk/
3080: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  rowid */.  int m
3090: 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  xSample;        
30a0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
30b0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
30c0: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
30d0: 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  */.  Stat4Sample
30e0: 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f   current;      /
30f0: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73  * Current row as
3100: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a   a Stat4Sample *
3110: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3130: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
3140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
3150: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61  ampling */.  Sta
3160: 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b  t4Sample *aBest;
3170: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3180: 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61 6d  of nCol best sam
3190: 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ples */.  int iM
31a0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
31b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
31c0: 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69 74  a[] of entry wit
31d0: 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65 20  h minimum score 
31e0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65  */.  int nSample
31f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3200: 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
3210: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20   of samples */. 
3220: 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65 72 6f 3b   int nMaxEqZero;
3230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3240: 78 20 6c 65 61 64 69 6e 67 20 30 20 69 6e 20 61  x leading 0 in a
3250: 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79 20 61 5b  nEq[] for any a[
3260: 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  ] entry */.  int
3270: 20 69 47 65 74 3b 20 20 20 20 20 20 20 20 20 20   iGet;          
3280: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3290: 6f 66 20 63 75 72 72 65 6e 74 20 73 61 6d 70 6c  of current sampl
32a0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 73 74  e accessed by st
32b0: 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20 20 53 74  at_get() */.  St
32c0: 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b 20 20 20  at4Sample *a;   
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
32e0: 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20 53 74 61   of mxSample Sta
32f0: 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65 63 74 73  t4Sample objects
3300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3320: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3330: 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d 61 6c 6c  ection, for mall
3340: 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  oc() */.};../* R
3350: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 75 73  eclaim memory us
3360: 65 64 20 62 79 20 61 20 53 74 61 74 34 53 61 6d  ed by a Stat4Sam
3370: 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ple.*/.#ifdef SQ
3380: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3390: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
33a0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6c 65  c void sampleCle
33b0: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
33c0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 29 7b  Stat4Sample *p){
33d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
33e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f   );.  if( p->nRo
33f0: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
3400: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
3410: 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  u.aRowid);.    p
3420: 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->nRowid = 0;.  
3430: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  }.}.#endif../* I
3440: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 42 4c  nitialize the BL
3450: 4f 42 20 76 61 6c 75 65 20 6f 66 20 61 20 52 4f  OB value of a RO
3460: 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  WID.*/.#ifdef SQ
3470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3480: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
3490: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74  c void sampleSet
34a0: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
34b0: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
34c0: 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  p, int n, const 
34d0: 75 38 20 2a 70 44 61 74 61 29 7b 0a 20 20 61 73  u8 *pData){.  as
34e0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
34f0: 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29   if( p->nRowid )
3500: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3510: 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b  b, p->u.aRowid);
3520: 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 3d  .  p->u.aRowid =
3530: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3540: 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b 0a 20 20  RawNN(db, n);.  
3550: 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20  if( p->u.aRowid 
3560: 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64  ){.    p->nRowid
3570: 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = n;.    memcpy
3580: 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 44  (p->u.aRowid, pD
3590: 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  ata, n);.  }else
35a0: 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20  {.    p->nRowid 
35b0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
35c0: 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  f../* Initialize
35d0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 76 61 6c   the INTEGER val
35e0: 75 65 20 6f 66 20 61 20 52 4f 57 49 44 2e 0a 2a  ue of a ROWID..*
35f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3600: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
3610: 53 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69  STAT4.static voi
3620: 64 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64  d sampleSetRowid
3630: 49 6e 74 36 34 28 73 71 6c 69 74 65 33 20 2a 64  Int64(sqlite3 *d
3640: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3650: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
3660: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3670: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77  );.  if( p->nRow
3680: 69 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  id ) sqlite3DbFr
3690: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77  ee(db, p->u.aRow
36a0: 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f 77 69 64  id);.  p->nRowid
36b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e 69 52 6f   = 0;.  p->u.iRo
36c0: 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
36d0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
36e0: 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
36f0: 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a 70 46 72   of object (*pFr
3700: 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54 6f 29 2e  om) into (*pTo).
3710: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3720: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3730: 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20 76  R_STAT4.static v
3740: 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70 79 28 53  oid sampleCopy(S
3750: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74  tat4Accum *p, St
3760: 61 74 34 53 61 6d 70 6c 65 20 2a 70 54 6f 2c 20  at4Sample *pTo, 
3770: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 46 72  Stat4Sample *pFr
3780: 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69 73 50 53  om){.  pTo->isPS
3790: 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d 2d 3e 69  ample = pFrom->i
37a0: 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d  sPSample;.  pTo-
37b0: 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69  >iCol = pFrom->i
37c0: 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69 48 61 73  Col;.  pTo->iHas
37d0: 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48 61 73 68  h = pFrom->iHash
37e0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
37f0: 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45  anEq, pFrom->anE
3800: 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  q, sizeof(tRowcn
3810: 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d  t)*p->nCol);.  m
3820: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c  emcpy(pTo->anLt,
3830: 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69   pFrom->anLt, si
3840: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3850: 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  >nCol);.  memcpy
3860: 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20 70 46 72  (pTo->anDLt, pFr
3870: 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69 7a 65 6f  om->anDLt, sizeo
3880: 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43  f(tRowcnt)*p->nC
3890: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  ol);.  if( pFrom
38a0: 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->nRowid ){.    
38b0: 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 28 70  sampleSetRowid(p
38c0: 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  ->db, pTo, pFrom
38d0: 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72 6f 6d 2d  ->nRowid, pFrom-
38e0: 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 7d 65  >u.aRowid);.  }e
38f0: 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  lse{.    sampleS
3900: 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e  etRowidInt64(p->
3910: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
3920: 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d  u.iRowid);.  }.}
3930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3940: 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
3950: 79 20 6f 66 20 61 20 53 74 61 74 34 41 63 63 75  y of a Stat4Accu
3960: 6d 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  m structure..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
3980: 34 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64  4Destructor(void
3990: 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74 61 74 34   *pOld){.  Stat4
39a0: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
39b0: 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b 0a 23 69  4Accum*)pOld;.#i
39c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
39d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
39e0: 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  4.  int i;.  for
39f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
3a00: 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61   i++) sampleClea
3a10: 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 42 65 73  r(p->db, p->aBes
3a20: 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t+i);.  for(i=0;
3a30: 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20   i<p->mxSample; 
3a40: 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61 72  i++) sampleClear
3a50: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b 69 29 3b  (p->db, p->a+i);
3a60: 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70  .  sampleClear(p
3a70: 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e  ->db, &p->curren
3a80: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t);.#endif.  sql
3a90: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3aa0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , p);.}../*.** I
3ab0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3ac0: 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28 4e   the stat_init(N
3ad0: 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e 63 74 69  ,K,C) SQL functi
3ae0: 6f 6e 2e 20 54 68 65 20 74 68 72 65 65 20 70 61  on. The three pa
3af0: 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 3a  rameters.** are:
3b00: 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20 20 54 68  .**     N:    Th
3b10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3b20: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
3b30: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72   including the r
3b40: 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65 20 31 29  owid/pk (note 1)
3b50: 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20 20 54 68  .**     K:    Th
3b60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3b70: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
3b80: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 72   excluding the r
3b90: 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20 20 20 20  owid/pk..**     
3ba0: 43 3a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72  C:    The number
3bb0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
3bc0: 69 6e 64 65 78 20 28 6e 6f 74 65 20 32 29 0a 2a  index (note 2).*
3bd0: 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20 20 49 6e  *.** Note 1:  In
3be0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
3bf0: 65 20 6f 66 20 74 68 65 20 63 6f 76 65 72 69 6e  e of the coverin
3c00: 67 20 69 6e 64 65 78 20 74 68 61 74 20 69 6d 70  g index that imp
3c10: 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 57 49 54  lements a.** WIT
3c20: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
3c30: 2c 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  , N is the numbe
3c40: 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
3c50: 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74 20 74 68   columns, not th
3c60: 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
3c70: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3c80: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
3c90: 20 4e 6f 74 65 20 32 3a 20 20 43 20 69 73 20 6f   Note 2:  C is o
3ca0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41  nly used for STA
3cb0: 54 33 20 61 6e 64 20 53 54 41 54 34 2e 0a 2a 2a  T3 and STAT4..**
3cc0: 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 65 73 20  .** For indexes 
3cd0: 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72 6f 77 69  on ordinary rowi
3ce0: 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d 4b 2b 31  d tables, N==K+1
3cf0: 2e 20 20 42 75 74 20 66 6f 72 20 69 6e 64 65 78  .  But for index
3d00: 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48 4f 55 54  es on.** WITHOUT
3d10: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2c 20 4e   ROWID tables, N
3d20: 3d 4b 2b 50 20 77 68 65 72 65 20 50 20 69 73 20  =K+P where P is 
3d30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3d40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
3d50: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 74  PRIMARY KEY of t
3d60: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
3d70: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 74 68  overing index th
3d80: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
3d90: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 57 49  e.** original WI
3da0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
3db0: 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20 61 20 73  e as N==K as a s
3dc0: 70 65 63 69 61 6c 20 63 61 73 65 2e 0a 2a 2a 0a  pecial case..**.
3dd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3de0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 53 74  allocates the St
3df0: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
3e00: 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20  in heap memory. 
3e10: 54 68 65 20 72 65 74 75 72 6e 20 0a 2a 2a 20 76  The return .** v
3e20: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
3e30: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
3e40: 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  cum object.  The
3e50: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65   datatype of the
3e60: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
3e70: 20 69 73 20 42 4c 4f 42 2c 20 62 75 74 20 69 74   is BLOB, but it
3e80: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
3e90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3ea0: 20 53 74 61 74 34 41 63 63 75 6d 0a 2a 2a 20 6f   Stat4Accum.** o
3eb0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
3ec0: 20 76 6f 69 64 20 73 74 61 74 49 6e 69 74 28 0a   void statInit(.
3ed0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3ee0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3ef0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3f00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3f10: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
3f20: 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  p;.  int nCol;  
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
3f60: 65 78 20 62 65 69 6e 67 20 73 61 6d 70 6c 65 64  ex being sampled
3f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f   */.  int nKeyCo
3f80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3f90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3fa0: 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 2a  of key columns *
3fb0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70 3b 20  /.  int nColUp; 
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f 75 6e      /* nCol roun
3fe0: 64 65 64 20 75 70 20 66 6f 72 20 61 6c 69 67 6e  ded up for align
3ff0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ment */.  int n;
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4020: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
4030: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llocate */.  sql
4040: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4060: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
4070: 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ion */.#ifdef SQ
4080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4090: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74  3_OR_STAT4.  int
40a0: 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49   mxSample = SQLI
40b0: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
40c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
40d0: 65 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ecode the three 
40e0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
40f0: 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  ts */.  UNUSED_P
4100: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
4110: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
4120: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
4130: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0]);.  assert( n
4140: 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43 6f 6c 55  Col>0 );.  nColU
4150: 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63  p = sizeof(tRowc
4160: 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b 31 29  nt)<8 ? (nCol+1)
4170: 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20 20 6e 4b  &~1 : nCol;.  nK
4180: 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  eyCol = sqlite3_
4190: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
41a0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  ]);.  assert( nK
41b0: 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29 3b 0a 20  eyCol<=nCol );. 
41c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
41d0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  >0 );..  /* Allo
41e0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72  cate the space r
41f0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
4200: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
4210: 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f  t */.  n = sizeo
4220: 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a  f(*p) .    + siz
4230: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4240: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
4250: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
4260: 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b  um.anEq */.    +
4270: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
4280: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
4290: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
42a0: 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a  4Accum.anDLt */.
42b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
42c0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
42d0: 41 54 34 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66  AT4.    + sizeof
42e0: 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70  (tRowcnt)*nColUp
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e    /* Stat4Accum.
4310: 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20 73 69  anLt */.    + si
4320: 7a 65 6f 66 28 53 74 61 74 34 53 61 6d 70 6c 65  zeof(Stat4Sample
4330: 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65  )*(nCol+mxSample
4340: 29 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63  )     /* Stat4Ac
4350: 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61 5b 5d  cum.aBest[], a[]
4360: 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66   */.    + sizeof
4370: 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43 6f 6c  (tRowcnt)*3*nCol
4380: 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c  Up*(nCol+mxSampl
4390: 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a 20 20  e).#endif.  ;.  
43a0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
43b0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
43c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d 20 73  ontext);.  p = s
43d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
43e0: 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28  ro(db, n);.  if(
43f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
4400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4410: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
4420: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4430: 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  }..  p->db = db;
4440: 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  .  p->nRow = 0;.
4450: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
4460: 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  ;.  p->nKeyCol =
4470: 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 2d 3e 63   nKeyCol;.  p->c
4480: 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d 20 28  urrent.anDLt = (
4490: 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d 3b 0a  tRowcnt*)&p[1];.
44a0: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45    p->current.anE
44b0: 71 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e  q = &p->current.
44c0: 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a  anDLt[nColUp];..
44d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
44e0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
44f0: 41 54 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a  AT4.  {.    u8 *
4500: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4520: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e  llocated space n
4530: 6f 74 20 79 65 74 20 61 73 73 69 67 6e 65 64 20  ot yet assigned 
4540: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
4570: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4580: 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a  h p->aSample[] *
4590: 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d  /..    p->iGet =
45a0: 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61   -1;.    p->mxSa
45b0: 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b  mple = mxSample;
45c0: 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65  .    p->nPSample
45d0: 20 3d 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c   = (tRowcnt)(sql
45e0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
45f0: 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78 53 61 6d  (argv[2])/(mxSam
4600: 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20  ple/3+1) + 1);. 
4610: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
4620: 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74  Lt = &p->current
4630: 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20  .anEq[nColUp];. 
4640: 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20 30 78 36     p->iPrn = 0x6
4650: 38 39 65 39 36 32 64 2a 28 75 33 32 29 6e 43 6f  89e962d*(u32)nCo
4660: 6c 20 5e 20 30 78 64 30 39 34 34 35 36 35 2a 28  l ^ 0xd0944565*(
4670: 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u32)sqlite3_valu
4680: 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a  e_int(argv[2]);.
4690: 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70    .    /* Set up
46a0: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e   the Stat4Accum.
46b0: 61 5b 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20  a[] and aBest[] 
46c0: 61 72 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d  arrays */.    p-
46d0: 3e 61 20 3d 20 28 73 74 72 75 63 74 20 53 74 61  >a = (struct Sta
46e0: 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75  t4Sample*)&p->cu
46f0: 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55  rrent.anLt[nColU
4700: 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74  p];.    p->aBest
4710: 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c   = &p->a[mxSampl
4720: 65 5d 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d  e];.    pSpace =
4730: 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53   (u8*)(&p->a[mxS
4740: 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20  ample+nCol]);.  
4750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78    for(i=0; i<(mx
4760: 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b  Sample+nCol); i+
4770: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  +){.      p->a[i
4780: 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e  ].anEq = (tRowcn
4790: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
47a0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
47b0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
47c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  ;.      p->a[i].
47d0: 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20  anLt = (tRowcnt 
47e0: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
47f0: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
4800: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
4810: 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e        p->a[i].an
4820: 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a  DLt = (tRowcnt *
4830: 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20  )pSpace; pSpace 
4840: 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  += (sizeof(tRowc
4850: 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20  nt) * nColUp);. 
4860: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4870: 20 28 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29   (pSpace - (u8*)
4880: 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20  p)==n );.  .    
4890: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
48a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
48b0: 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20  aBest[i].iCol = 
48c0: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  i;.    }.  }.#en
48d0: 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  dif..  /* Return
48e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
48f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65  e allocated obje
4900: 63 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ct to the caller
4910: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
4920: 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f 69 6e 74  * only the point
4930: 65 72 20 28 74 68 65 20 32 6e 64 20 70 61 72 61  er (the 2nd para
4940: 6d 65 74 65 72 29 20 6d 61 74 74 65 72 73 2e 20  meter) matters. 
4950: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4960: 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 28 67 69   object.  ** (gi
4970: 76 65 6e 20 62 79 20 74 68 65 20 33 72 64 20 70  ven by the 3rd p
4980: 61 72 61 6d 65 74 65 72 29 20 69 73 20 6e 65 76  arameter) is nev
4990: 65 72 20 75 73 65 64 20 61 6e 64 20 63 61 6e 20  er used and can 
49a0: 62 65 20 61 6e 79 20 70 6f 73 69 74 69 76 65 0a  be any positive.
49b0: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f 0a 20    ** value. */. 
49c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
49d0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2c  blob(context, p,
49e0: 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20 73 74 61   sizeof(*p), sta
49f0: 74 34 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 7d  t4Destructor);.}
4a00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75  .static const Fu
4a10: 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74 46 75  ncDef statInitFu
4a20: 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b 49 73  ncdef = {.  2+Is
4a30: 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20  Stat34,      /* 
4a40: 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45  nArg */.  SQLITE
4a50: 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75  _UTF8,     /* fu
4a60: 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  ncFlags */.  0, 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a80: 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20   pUserData */.  
4a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4aa0: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73   /* pNext */.  s
4ab0: 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20 20 20  tatInit,        
4ac0: 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30  /* xSFunc */.  0
4ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ae0: 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a  /* xFinalize */.
4af0: 20 20 22 73 74 61 74 5f 69 6e 69 74 22 2c 20 20    "stat_init",  
4b00: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
4b10: 20 7b 30 7d 0a 7d 3b 0a 0a 23 69 66 64 65 66 20   {0}.};..#ifdef 
4b20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4b30: 41 54 34 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61  AT4./*.** pNew a
4b40: 6e 64 20 70 4f 6c 64 20 61 72 65 20 62 6f 74 68  nd pOld are both
4b50: 20 63 61 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70   candidate non-p
4b60: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 73 20  eriodic samples 
4b70: 73 65 6c 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a  selected for .**
4b80: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
4b90: 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f   (pNew->iCol==pO
4ba0: 6c 64 2d 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72  ld->iCol). Ignor
4bb0: 69 6e 67 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ing this column 
4bc0: 61 6e 64 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  and .** consider
4bd0: 69 6e 67 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61  ing only any tra
4be0: 69 6c 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e  iling columns an
4bf0: 64 20 74 68 65 20 73 61 6d 70 6c 65 20 68 61 73  d the sample has
4c00: 68 20 76 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a  h value, this.**
4c10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4c20: 73 20 74 72 75 65 20 69 66 20 73 61 6d 70 6c 65  s true if sample
4c30: 20 70 4e 65 77 20 69 73 20 74 6f 20 62 65 20 70   pNew is to be p
4c40: 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f  referred over pO
4c50: 6c 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  ld..** In other 
4c60: 77 6f 72 64 73 2c 20 69 66 20 77 65 20 61 73 73  words, if we ass
4c70: 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 61 72  ume that the car
4c80: 64 69 6e 61 6c 69 74 69 65 73 20 6f 66 20 74 68  dinalities of th
4c90: 65 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f  e selected.** co
4ca0: 6c 75 6d 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e  lumn for pNew an
4cb0: 64 20 70 4f 6c 64 20 61 72 65 20 65 71 75 61 6c  d pOld are equal
4cc0: 2c 20 69 73 20 70 4e 65 77 20 74 6f 20 62 65 20  , is pNew to be 
4cd0: 70 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 70  preferred over p
4ce0: 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Old..**.** This 
4cf0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
4d00: 20 74 68 61 74 20 66 6f 72 20 65 61 63 68 20 61   that for each a
4d10: 72 67 75 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20  rgument sample, 
4d20: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a  the contents of.
4d30: 2a 2a 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72  ** the anEq[] ar
4d40: 72 61 79 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65  ray from pSample
4d50: 2d 3e 61 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e  ->anEq[pSample->
4d60: 69 43 6f 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20  iCol+1] onwards 
4d70: 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73  are valid. .*/.s
4d80: 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70 6c 65  tatic int sample
4d90: 49 73 42 65 74 74 65 72 50 6f 73 74 28 0a 20 20  IsBetterPost(.  
4da0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63  Stat4Accum *pAcc
4db0: 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70  um, .  Stat4Samp
4dc0: 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61  le *pNew, .  Sta
4dd0: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29  t4Sample *pOld.)
4de0: 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  {.  int nCol = p
4df0: 41 63 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69  Accum->nCol;.  i
4e00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
4e10: 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64  pNew->iCol==pOld
4e20: 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->iCol );.  for(
4e30: 69 3d 70 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20  i=pNew->iCol+1; 
4e40: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
4e50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71    if( pNew->anEq
4e60: 5b 69 5d 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69  [i]>pOld->anEq[i
4e70: 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
4e80: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71    if( pNew->anEq
4e90: 5b 69 5d 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69  [i]<pOld->anEq[i
4ea0: 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ] ) return 0;.  
4eb0: 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 48  }.  if( pNew->iH
4ec0: 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20  ash>pOld->iHash 
4ed0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
4ee0: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4ef0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4f00: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
4f10: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
4f20: 72 6e 20 74 72 75 65 20 69 66 20 70 4e 65 77 20  rn true if pNew 
4f30: 69 73 20 74 6f 20 62 65 20 70 72 65 66 65 72 72  is to be preferr
4f40: 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a  ed over pOld..**
4f50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4f60: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 66  n assumes that f
4f70: 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  or each argument
4f80: 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e   sample, the con
4f90: 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tents of.** the 
4fa0: 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f  anEq[] array fro
4fb0: 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b  m pSample->anEq[
4fc0: 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f  pSample->iCol] o
4fd0: 6e 77 61 72 64 73 20 61 72 65 20 76 61 6c 69 64  nwards are valid
4fe0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
4ff0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5000: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
5010: 41 63 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53  Accum, .  Stat4S
5020: 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20  ample *pNew, .  
5030: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c  Stat4Sample *pOl
5040: 64 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  d.){.  tRowcnt n
5050: 45 71 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e  EqNew = pNew->an
5060: 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a  Eq[pNew->iCol];.
5070: 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64    tRowcnt nEqOld
5080: 20 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f   = pOld->anEq[pO
5090: 6c 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73  ld->iCol];..  as
50a0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53  sert( pOld->isPS
50b0: 61 6d 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77  ample==0 && pNew
50c0: 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29  ->isPSample==0 )
50d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 53 74  ;.  assert( IsSt
50e0: 61 74 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43  at4 || (pNew->iC
50f0: 6f 6c 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69  ol==0 && pOld->i
5100: 43 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66  Col==0) );..  if
5110: 28 20 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64  ( (nEqNew>nEqOld
5120: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 69  ) ) return 1;.#i
5130: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5140: 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28 20 6e  LE_STAT4.  if( n
5150: 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b  EqNew==nEqOld ){
5160: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69  .    if( pNew->i
5170: 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29  Col<pOld->iCol )
5180: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72   return 1;.    r
5190: 65 74 75 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f  eturn (pNew->iCo
51a0: 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26  l==pOld->iCol &&
51b0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 50   sampleIsBetterP
51c0: 6f 73 74 28 70 41 63 63 75 6d 2c 20 70 4e 65 77  ost(pAccum, pNew
51d0: 2c 20 70 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20  , pOld));.  }.  
51e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
51f0: 20 20 72 65 74 75 72 6e 20 28 6e 45 71 4e 65 77    return (nEqNew
5200: 3d 3d 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77  ==nEqOld && pNew
5210: 2d 3e 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48  ->iHash>pOld->iH
5220: 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ash);.#endif.}..
5230: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63  /*.** Copy the c
5240: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c  ontents of sampl
5250: 65 20 2a 70 4e 65 77 20 69 6e 74 6f 20 74 68 65  e *pNew into the
5260: 20 70 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49   p->a[] array. I
5270: 66 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20  f necessary,.** 
5280: 72 65 6d 6f 76 65 20 74 68 65 20 6c 65 61 73 74  remove the least
5290: 20 64 65 73 69 72 61 62 6c 65 20 73 61 6d 70 6c   desirable sampl
52a0: 65 20 66 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f  e from p->a[] to
52b0: 20 6d 61 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73   make room..*/.s
52c0: 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c  tatic void sampl
52d0: 65 49 6e 73 65 72 74 28 53 74 61 74 34 41 63 63  eInsert(Stat4Acc
52e0: 75 6d 20 2a 70 2c 20 53 74 61 74 34 53 61 6d 70  um *p, Stat4Samp
52f0: 6c 65 20 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45  le *pNew, int nE
5300: 71 5a 65 72 6f 29 7b 0a 20 20 53 74 61 74 34 53  qZero){.  Stat4S
5310: 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d  ample *pSample =
5320: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
5330: 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34 20  assert( IsStat4 
5340: 7c 7c 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b  || nEqZero==0 );
5350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5360: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f  ENABLE_STAT4.  /
5370: 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 6e 4d 61  * Stat4Accum.nMa
5380: 78 45 71 5a 65 72 6f 20 69 73 20 73 65 74 20 74  xEqZero is set t
5390: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  o the maximum nu
53a0: 6d 62 65 72 20 6f 66 20 6c 65 61 64 69 6e 67 20  mber of leading 
53b0: 30 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 69 6e  0.  ** values in
53c0: 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61   the anEq[] arra
53d0: 79 20 6f 66 20 61 6e 79 20 73 61 6d 70 6c 65 20  y of any sample 
53e0: 69 6e 20 53 74 61 74 34 41 63 63 75 6d 2e 61 5b  in Stat4Accum.a[
53f0: 5d 2e 20 49 6e 0a 20 20 2a 2a 20 6f 74 68 65 72  ]. In.  ** other
5400: 20 77 6f 72 64 73 2c 20 69 66 20 6e 4d 61 78 45   words, if nMaxE
5410: 71 5a 65 72 6f 20 69 73 20 6e 2c 20 74 68 65 6e  qZero is n, then
5420: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
5430: 64 20 74 68 61 74 20 74 68 65 72 65 0a 20 20 2a  d that there.  *
5440: 2a 20 61 72 65 20 6e 6f 20 73 61 6d 70 6c 65 73  * are no samples
5450: 20 77 69 74 68 20 53 74 61 74 34 53 61 6d 70 6c   with Stat4Sampl
5460: 65 2e 61 6e 45 71 5b 6d 5d 3d 3d 30 20 66 6f 72  e.anEq[m]==0 for
5470: 20 28 6d 3e 3d 6e 29 2e 20 2a 2f 0a 20 20 69 66   (m>=n). */.  if
5480: 28 20 6e 45 71 5a 65 72 6f 3e 70 2d 3e 6e 4d 61  ( nEqZero>p->nMa
5490: 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70  xEqZero ){.    p
54a0: 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f 20 3d 20 6e  ->nMaxEqZero = n
54b0: 45 71 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 69 66  EqZero;.  }.  if
54c0: 28 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c  ( pNew->isPSampl
54d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 74  e==0 ){.    Stat
54e0: 34 53 61 6d 70 6c 65 20 2a 70 55 70 67 72 61 64  4Sample *pUpgrad
54f0: 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
5500: 74 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e  t( pNew->anEq[pN
5510: 65 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a  ew->iCol]>0 );..
5520: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 61 6d 70      /* This samp
5530: 6c 65 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  le is being adde
5540: 64 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  d because the pr
5550: 65 66 69 78 20 74 68 61 74 20 65 6e 64 73 20 69  efix that ends i
5560: 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a  n column .    **
5570: 20 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e   iCol occurs man
5580: 79 20 74 69 6d 65 73 20 69 6e 20 74 68 65 20 74  y times in the t
5590: 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  able. However, i
55a0: 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
55b0: 79 0a 20 20 20 20 2a 2a 20 61 64 64 65 64 20 61  y.    ** added a
55c0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61   sample that sha
55d0: 72 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2c  res this prefix,
55e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
55f0: 64 20 74 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20  d to add.    ** 
5600: 74 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61  this one. Instea
5610: 64 2c 20 75 70 67 72 61 64 65 20 74 68 65 20 70  d, upgrade the p
5620: 72 69 6f 72 69 74 79 20 6f 66 20 74 68 65 20 68  riority of the h
5630: 69 67 68 65 73 74 20 70 72 69 6f 72 69 74 79 0a  ighest priority.
5640: 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20      ** existing 
5650: 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72  sample that shar
5660: 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2e 20  es this prefix. 
5670: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   */.    for(i=p-
5680: 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30  >nSample-1; i>=0
5690: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74  ; i--){.      St
56a0: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20  at4Sample *pOld 
56b0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
56c0: 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71    if( pOld->anEq
56d0: 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20  [pNew->iCol]==0 
56e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
56f0: 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29  Old->isPSample )
5700: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
5710: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69   assert( pOld->i
5720: 43 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29  Col>pNew->iCol )
5730: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5740: 28 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  ( sampleIsBetter
5750: 28 70 2c 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20  (p, pNew, pOld) 
5760: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
5770: 55 70 67 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61  Upgrade==0 || sa
5780: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
5790: 70 4f 6c 64 2c 20 70 55 70 67 72 61 64 65 29 20  pOld, pUpgrade) 
57a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  ){.          pUp
57b0: 67 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20  grade = pOld;.  
57c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
57d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55      }.    if( pU
57e0: 70 67 72 61 64 65 20 29 7b 0a 20 20 20 20 20 20  pgrade ){.      
57f0: 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d  pUpgrade->iCol =
5800: 20 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20   pNew->iCol;.   
5810: 20 20 20 70 55 70 67 72 61 64 65 2d 3e 61 6e 45     pUpgrade->anE
5820: 71 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c  q[pUpgrade->iCol
5830: 5d 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70  ] = pNew->anEq[p
5840: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a  Upgrade->iCol];.
5850: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f        goto find_
5860: 6e 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20  new_min;.    }. 
5870: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5880: 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 72 65  If necessary, re
5890: 6d 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e  move sample iMin
58a0: 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
58b0: 72 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65  r the new sample
58c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53  . */.  if( p->nS
58d0: 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70  ample>=p->mxSamp
58e0: 6c 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53  le ){.    Stat4S
58f0: 61 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70  ample *pMin = &p
5900: 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20  ->a[p->iMin];.  
5910: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20    tRowcnt *anEq 
5920: 3d 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20  = pMin->anEq;.  
5930: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20    tRowcnt *anLt 
5940: 3d 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20  = pMin->anLt;.  
5950: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74    tRowcnt *anDLt
5960: 20 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a   = pMin->anDLt;.
5970: 20 20 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28      sampleClear(
5980: 70 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20  p->db, pMin);.  
5990: 20 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20    memmove(pMin, 
59a0: 26 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66  &pMin[1], sizeof
59b0: 28 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53  (p->a[0])*(p->nS
59c0: 61 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29  ample-p->iMin-1)
59d0: 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d  );.    pSample =
59e0: 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c   &p->a[p->nSampl
59f0: 65 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c  e-1];.    pSampl
5a00: 65 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20  e->nRowid = 0;. 
5a10: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71     pSample->anEq
5a20: 20 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61   = anEq;.    pSa
5a30: 6d 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e  mple->anDLt = an
5a40: 44 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  DLt;.    pSample
5a50: 2d 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20  ->anLt = anLt;. 
5a60: 20 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20     p->nSample = 
5a70: 70 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20  p->mxSample-1;. 
5a80: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f   }..  /* The "ro
5a90: 77 73 20 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f  ws less-than" fo
5aa0: 72 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  r the rowid colu
5ab0: 6d 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  mn must be great
5ac0: 65 72 20 74 68 61 6e 20 74 68 61 74 0a 20 20 2a  er than that.  *
5ad0: 2a 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 73  * for the last s
5ae0: 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e  ample in the p->
5af0: 61 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72  a[] array. Other
5b00: 77 69 73 65 2c 20 74 68 65 20 73 61 6d 70 6c 65  wise, the sample
5b10: 73 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20  s would.  ** be 
5b20: 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f  out of order. */
5b30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b40: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 61 73  NABLE_STAT4.  as
5b50: 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
5b60: 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
5b70: 4e 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f  New->anLt[p->nCo
5b80: 6c 2d 31 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e  l-1] > p->a[p->n
5b90: 53 61 6d 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70  Sample-1].anLt[p
5ba0: 2d 3e 6e 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e  ->nCol-1] );.#en
5bb0: 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  dif..  /* Insert
5bc0: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20   the new sample 
5bd0: 2a 2f 0a 20 20 70 53 61 6d 70 6c 65 20 3d 20 26  */.  pSample = &
5be0: 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d  p->a[p->nSample]
5bf0: 3b 0a 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70  ;.  sampleCopy(p
5c00: 2c 20 70 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29  , pSample, pNew)
5c10: 3b 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b  ;.  p->nSample++
5c20: 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
5c30: 20 66 69 72 73 74 20 6e 45 71 5a 65 72 6f 20 65   first nEqZero e
5c40: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 6e  ntries in the an
5c50: 45 71 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  Eq[] array. */. 
5c60: 20 6d 65 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d   memset(pSample-
5c70: 3e 61 6e 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66  >anEq, 0, sizeof
5c80: 28 74 52 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72  (tRowcnt)*nEqZer
5c90: 6f 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  o);..#ifdef SQLI
5ca0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
5cb0: 20 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23   find_new_min:.#
5cc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
5cd0: 53 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d  Sample>=p->mxSam
5ce0: 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ple ){.    int i
5cf0: 4d 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Min = -1;.    fo
5d00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61  r(i=0; i<p->mxSa
5d10: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
5d20: 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73    if( p->a[i].is
5d30: 50 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e  PSample ) contin
5d40: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d  ue;.      if( iM
5d50: 69 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73  in<0 || sampleIs
5d60: 42 65 74 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b  Better(p, &p->a[
5d70: 69 4d 69 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29  iMin], &p->a[i])
5d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e   ){.        iMin
5d90: 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = i;.      }.  
5da0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5db0: 69 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70  iMin>=0 );.    p
5dc0: 2d 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20  ->iMin = iMin;. 
5dd0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
5de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
5df0: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
5e00: 2f 2a 0a 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e  /*.** Field iChn
5e10: 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  g of the index b
5e20: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 68 61 73  eing scanned has
5e30: 20 63 68 61 6e 67 65 64 2e 20 53 6f 20 61 74 20   changed. So at 
5e40: 74 68 69 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d  this point.** p-
5e50: 3e 63 75 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e  >current contain
5e60: 73 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20  s a sample that 
5e70: 72 65 66 6c 65 63 74 73 20 74 68 65 20 70 72 65  reflects the pre
5e80: 76 69 6f 75 73 20 72 6f 77 20 6f 66 20 74 68 65  vious row of the
5e90: 0a 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 76  .** index. The v
5ea0: 61 6c 75 65 20 6f 66 20 61 6e 45 71 5b 69 43 68  alue of anEq[iCh
5eb0: 6e 67 5d 20 61 6e 64 20 73 75 62 73 65 71 75 65  ng] and subseque
5ec0: 6e 74 20 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e  nt anEq[] elemen
5ed0: 74 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63  ts are.** correc
5ee0: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  t at this point.
5ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f00: 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f  samplePushPrevio
5f10: 75 73 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70  us(Stat4Accum *p
5f20: 2c 20 69 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69  , int iChng){.#i
5f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5f40: 4c 45 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 69  LE_STAT4.  int i
5f50: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
5f60: 20 61 6e 79 20 73 61 6d 70 6c 65 73 20 66 72 6f   any samples fro
5f70: 6d 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  m the aBest[] ar
5f80: 72 61 79 20 73 68 6f 75 6c 64 20 62 65 20 70 75  ray should be pu
5f90: 73 68 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49  shed.  ** into I
5fa0: 6e 64 65 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61  ndexSample.a[] a
5fb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a  t this point.  *
5fc0: 2f 0a 20 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43  /.  for(i=(p->nC
5fd0: 6f 6c 2d 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b  ol-2); i>=iChng;
5fe0: 20 69 2d 2d 29 7b 0a 20 20 20 20 53 74 61 74 34   i--){.    Stat4
5ff0: 53 61 6d 70 6c 65 20 2a 70 42 65 73 74 20 3d 20  Sample *pBest = 
6000: 26 70 2d 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20  &p->aBest[i];.  
6010: 20 20 70 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d    pBest->anEq[i]
6020: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
6030: 45 71 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Eq[i];.    if( p
6040: 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53  ->nSample<p->mxS
6050: 61 6d 70 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49  ample || sampleI
6060: 73 42 65 74 74 65 72 28 70 2c 20 70 42 65 73 74  sBetter(p, pBest
6070: 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d  , &p->a[p->iMin]
6080: 29 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c  ) ){.      sampl
6090: 65 49 6e 73 65 72 74 28 70 2c 20 70 42 65 73 74  eInsert(p, pBest
60a0: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
60b0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
60c0: 20 6e 6f 20 73 61 6d 70 6c 65 20 63 6f 6e 74 61   no sample conta
60d0: 69 6e 73 20 61 6e 20 61 6e 45 71 5b 5d 20 65 6e  ins an anEq[] en
60e0: 74 72 79 20 77 69 74 68 20 61 6e 20 69 6e 64 65  try with an inde
60f0: 78 20 6f 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61  x of.  ** p->nMa
6100: 78 45 71 5a 65 72 6f 20 6f 72 20 67 72 65 61 74  xEqZero or great
6110: 65 72 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  er set to zero. 
6120: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  */.  for(i=p->nS
6130: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
6140: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  --){.    int j;.
6150: 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61      for(j=p->nMa
6160: 78 45 71 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43  xEqZero; j<p->nC
6170: 6f 6c 3b 20 6a 2b 2b 29 20 61 73 73 65 72 74 28  ol; j++) assert(
6180: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
6190: 3e 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  >0 );.  }..  /* 
61a0: 55 70 64 61 74 65 20 74 68 65 20 61 6e 45 71 5b  Update the anEq[
61b0: 5d 20 66 69 65 6c 64 73 20 6f 66 20 61 6e 79 20  ] fields of any 
61c0: 73 61 6d 70 6c 65 73 20 61 6c 72 65 61 64 79 20  samples already 
61d0: 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20  collected. */.  
61e0: 69 66 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61  if( iChng<p->nMa
61f0: 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20 20 20 66  xEqZero ){.    f
6200: 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d  or(i=p->nSample-
6210: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6220: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6230: 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a    for(j=iChng; j
6240: 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
6250: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
6260: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29  [i].anEq[j]==0 )
6270: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
6280: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
6290: 45 71 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  Eq[j];.      }. 
62a0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61 78     }.    p->nMax
62b0: 45 71 5a 65 72 6f 20 3d 20 69 43 68 6e 67 3b 0a  EqZero = iChng;.
62c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
62d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62e0: 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 26 26 20  NABLE_STAT3) && 
62f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20  ENABLE_STAT4).  
6310: 69 66 28 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a  if( iChng==0 ){.
6320: 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20      tRowcnt nLt 
6330: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c  = p->current.anL
6340: 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e  t[0];.    tRowcn
6350: 74 20 6e 45 71 20 3d 20 70 2d 3e 63 75 72 72 65  t nEq = p->curre
6360: 6e 74 2e 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20  nt.anEq[0];..   
6370: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
6380: 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65 72  s is to be a per
6390: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49 66  iodic sample. If
63a0: 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a   so, add it. */.
63b0: 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e      if( (nLt/p->
63c0: 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b  nPSample)!=(nLt+
63d0: 6e 45 71 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  nEq)/p->nPSample
63e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72   ){.      p->cur
63f0: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
6400: 20 31 3b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65   1;.      sample
6410: 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63 75  Insert(p, &p->cu
6420: 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20  rrent, 0);.     
6430: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53   p->current.isPS
6440: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ample = 0;.    }
6450: 65 6c 73 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72  else ..    /* Or
6460: 20 69 66 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d   if it is a non-
6470: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e  periodic sample.
6480: 20 41 64 64 20 69 74 20 69 6e 20 74 68 69 73 20   Add it in this 
6490: 63 61 73 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  case too. */.   
64a0: 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c   if( p->nSample<
64b0: 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20  p->mxSample .   
64c0: 20 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74    || sampleIsBet
64d0: 74 65 72 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ter(p, &p->curre
64e0: 6e 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69  nt, &p->a[p->iMi
64f0: 6e 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  n]) .    ){.    
6500: 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70    sampleInsert(p
6510: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30  , &p->current, 0
6520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
6530: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
6540: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
6550: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 55 4e 55 53  _OR_STAT4.  UNUS
6560: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 20  ED_PARAMETER( p 
6570: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
6580: 4d 45 54 45 52 28 20 69 43 68 6e 67 20 29 3b 0a  METER( iChng );.
6590: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
65a0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
65b0: 66 20 74 68 65 20 73 74 61 74 5f 70 75 73 68 20  f the stat_push 
65c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73  SQL function:  s
65d0: 74 61 74 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a  tat_push(P,C,R).
65e0: 2a 2a 20 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a  ** Arguments:.**
65f0: 0a 2a 2a 20 20 20 20 50 20 20 20 20 20 50 6f 69  .**    P     Poi
6600: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
6610: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 63 72  4Accum object cr
6620: 65 61 74 65 64 20 62 79 20 73 74 61 74 5f 69 6e  eated by stat_in
6630: 69 74 28 29 0a 2a 2a 20 20 20 20 43 20 20 20 20  it().**    C    
6640: 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d   Index of left-m
6650: 6f 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69  ost column to di
6660: 66 66 65 72 20 66 72 6f 6d 20 70 72 65 76 69 6f  ffer from previo
6670: 75 73 20 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20  us row.**    R  
6680: 20 20 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65     Rowid for the
6690: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d   current row.  M
66a0: 69 67 68 74 20 62 65 20 61 20 6b 65 79 20 72 65  ight be a key re
66b0: 63 6f 72 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20  cord for.**     
66c0: 20 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57       WITHOUT ROW
66d0: 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ID tables..**.**
66e0: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
66f0: 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
6700: 73 20 4e 55 4c 4c 2e 20 20 49 74 27 73 20 70 75  s NULL.  It's pu
6710: 72 70 6f 73 65 20 69 74 20 74 6f 20 61 63 63 75  rpose it to accu
6720: 6d 75 6c 61 74 65 0a 2a 2a 20 73 74 61 74 69 73  mulate.** statis
6730: 74 69 63 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f  tical data and/o
6740: 72 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  r samples in the
6750: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
6760: 63 74 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ct about the.** 
6770: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
6780: 79 7a 65 64 2e 20 20 54 68 65 20 73 74 61 74 5f  yzed.  The stat_
6790: 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69  get() SQL functi
67a0: 6f 6e 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  on will later be
67b0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72   used to.** extr
67c0: 61 63 74 20 72 65 6c 65 76 61 6e 74 20 69 6e 66  act relevant inf
67d0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e  ormation for con
67e0: 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 73 71  structing the sq
67f0: 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
6800: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70  s..**.** The R p
6810: 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79  arameter is only
6820: 20 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20   used for STAT3 
6830: 61 6e 64 20 53 54 41 54 34 0a 2a 2f 0a 73 74 61  and STAT4.*/.sta
6840: 74 69 63 20 76 6f 69 64 20 73 74 61 74 50 75 73  tic void statPus
6850: 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  h(.  sqlite3_con
6860: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6870: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6880: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6890: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  v.){.  int i;.. 
68a0: 20 2f 2a 20 54 68 65 20 74 68 72 65 65 20 66 75   /* The three fu
68b0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
68c0: 20 2a 2f 0a 20 20 53 74 61 74 34 41 63 63 75 6d   */.  Stat4Accum
68d0: 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63 75   *p = (Stat4Accu
68e0: 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  m*)sqlite3_value
68f0: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
6900: 20 20 69 6e 74 20 69 43 68 6e 67 20 3d 20 73 71    int iChng = sq
6910: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
6920: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55  argv[1]);..  UNU
6930: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61  SED_PARAMETER( a
6940: 72 67 63 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rgc );.  UNUSED_
6950: 50 41 52 41 4d 45 54 45 52 28 20 63 6f 6e 74 65  PARAMETER( conte
6960: 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  xt );.  assert( 
6970: 70 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 61  p->nCol>0 );.  a
6980: 73 73 65 72 74 28 20 69 43 68 6e 67 3c 70 2d 3e  ssert( iChng<p->
6990: 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69 66 28 20 70  nCol );..  if( p
69a0: 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  ->nRow==0 ){.   
69b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
69c0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 74 68  first call to th
69d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 44 6f 20  is function. Do 
69e0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 20  initialization. 
69f0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6a00: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20  i<p->nCol; i++) 
6a10: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6a20: 69 5d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  i] = 1;.  }else{
6a30: 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61  .    /* Second a
6a40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  nd subsequent ca
6a50: 6c 6c 73 20 67 65 74 20 70 72 6f 63 65 73 73 65  lls get processe
6a60: 64 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 73 61  d here */.    sa
6a70: 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73  mplePushPrevious
6a80: 28 70 2c 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20  (p, iChng);..   
6a90: 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 44 4c 74   /* Update anDLt
6aa0: 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61  [], anLt[] and a
6ab0: 6e 45 71 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74  nEq[] to reflect
6ac0: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
6ad0: 20 61 70 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f   apply.    ** to
6ae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
6af0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   of the index. *
6b00: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6b10: 3c 69 43 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  <iChng; i++){.  
6b20: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61      p->current.a
6b30: 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a  nEq[i]++;.    }.
6b40: 20 20 20 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b      for(i=iChng;
6b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
6b60: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65  {.      p->curre
6b70: 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23  nt.anDLt[i]++;.#
6b80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b90: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
6ba0: 54 34 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  T4.      p->curr
6bb0: 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70  ent.anLt[i] += p
6bc0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
6bd0: 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ];.#endif.      
6be0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6bf0: 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  i] = 1;.    }.  
6c00: 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23  }.  p->nRow++;.#
6c10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6c20: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
6c30: 54 34 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  T4.  if( sqlite3
6c40: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
6c50: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  [2])==SQLITE_INT
6c60: 45 47 45 52 20 29 7b 0a 20 20 20 20 73 61 6d 70  EGER ){.    samp
6c70: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
6c80: 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65  p->db, &p->curre
6c90: 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  nt, sqlite3_valu
6ca0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 32 5d 29  e_int64(argv[2])
6cb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6cc0: 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 28 70  sampleSetRowid(p
6cd0: 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e  ->db, &p->curren
6ce0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
6cf0: 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 2c  _bytes(argv[2]),
6d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6d30: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6d40: 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  2]));.  }.  p->c
6d50: 75 72 72 65 6e 74 2e 69 48 61 73 68 20 3d 20 70  urrent.iHash = p
6d60: 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e  ->iPrn = p->iPrn
6d70: 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31 32  *1103515245 + 12
6d80: 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  345;.#endif..#if
6d90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6da0: 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20  E_STAT4.  {.    
6db0: 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d  tRowcnt nLt = p-
6dc0: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d  >current.anLt[p-
6dd0: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f  >nCol-1];..    /
6de0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
6df0: 69 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f  is to be a perio
6e00: 64 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73  dic sample. If s
6e10: 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20  o, add it. */.  
6e20: 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50    if( (nLt/p->nP
6e30: 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 31 29  Sample)!=(nLt+1)
6e40: 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a  /p->nPSample ){.
6e50: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6e60: 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a  .isPSample = 1;.
6e70: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6e80: 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  .iCol = 0;.     
6e90: 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c   sampleInsert(p,
6ea0: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 70 2d   &p->current, p-
6eb0: 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  >nCol-1);.      
6ec0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61  p->current.isPSa
6ed0: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  mple = 0;.    }.
6ee0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
6ef0: 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  he aBest[] array
6f00: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
6f10: 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b  ; i<(p->nCol-1);
6f20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
6f30: 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20 3d 20 69  current.iCol = i
6f40: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69  ;.      if( i>=i
6f50: 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c 65 49 73  Chng || sampleIs
6f60: 42 65 74 74 65 72 50 6f 73 74 28 70 2c 20 26 70  BetterPost(p, &p
6f70: 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70 2d 3e 61  ->current, &p->a
6f80: 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Best[i]) ){.    
6f90: 20 20 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70      sampleCopy(p
6fa0: 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d 2c 20  , &p->aBest[i], 
6fb0: 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b 0a 20 20  &p->current);.  
6fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6fd0: 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20  #endif.}.static 
6fe0: 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74  const FuncDef st
6ff0: 61 74 50 75 73 68 46 75 6e 63 64 65 66 20 3d 20  atPushFuncdef = 
7000: 7b 0a 20 20 32 2b 49 73 53 74 61 74 33 34 2c 20  {.  2+IsStat34, 
7010: 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a       /* nArg */.
7020: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20    SQLITE_UTF8,  
7030: 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20     /* funcFlags 
7040: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7050: 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61        /* pUserDa
7060: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
7080: 74 20 2a 2f 0a 20 20 73 74 61 74 50 75 73 68 2c  t */.  statPush,
7090: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 46 75 6e          /* xSFun
70a0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
70b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61          /* xFina
70c0: 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f  lize */.  "stat_
70d0: 70 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e  push",     /* zN
70e0: 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a  ame */.  {0}.};.
70f0: 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45  .#define STAT_GE
7100: 54 5f 53 54 41 54 31 20 30 20 20 20 20 20 20 20  T_STAT1 0       
7110: 20 20 20 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c     /* "stat" col
7120: 75 6d 6e 20 6f 66 20 73 74 61 74 31 20 74 61 62  umn of stat1 tab
7130: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  le */.#define ST
7140: 41 54 5f 47 45 54 5f 52 4f 57 49 44 20 31 20 20  AT_GET_ROWID 1  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 22 72 6f 77 69          /* "rowi
7160: 64 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61  d" column of sta
7170: 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23  t[34] entry */.#
7180: 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f  define STAT_GET_
7190: 4e 45 51 20 20 20 32 20 20 20 20 20 20 20 20 20  NEQ   2         
71a0: 20 2f 2a 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e   /* "neq" column
71b0: 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74   of stat[34] ent
71c0: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ry */.#define ST
71d0: 41 54 5f 47 45 54 5f 4e 4c 54 20 20 20 33 20 20  AT_GET_NLT   3  
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22          /* "nlt"
71f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b   column of stat[
7200: 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65  34] entry */.#de
7210: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 44  fine STAT_GET_ND
7220: 4c 54 20 20 34 20 20 20 20 20 20 20 20 20 20 2f  LT  4          /
7230: 2a 20 22 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20  * "ndlt" column 
7240: 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72  of stat[34] entr
7250: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  y */../*.** Impl
7260: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7270: 65 20 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20  e stat_get(P,J) 
7280: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
7290: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
72a0: 2a 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  * used to query 
72b0: 73 74 61 74 69 73 74 69 63 61 6c 20 69 6e 66 6f  statistical info
72c0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  rmation that has
72d0: 20 62 65 65 6e 20 67 61 74 68 65 72 65 64 20 69   been gathered i
72e0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 74 61 74 34  nto.** the Stat4
72f0: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 62 79 20  Accum object by 
7300: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73  prior calls to s
7310: 74 61 74 5f 70 75 73 68 28 29 2e 20 20 54 68 65  tat_push().  The
7320: 20 50 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20   P parameter.** 
7330: 68 61 73 20 74 79 70 65 20 42 4c 4f 42 20 62 75  has type BLOB bu
7340: 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  t it is really j
7350: 75 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ust a pointer to
7360: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20   the Stat4Accum 
7370: 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 63  object..** The c
7380: 6f 6e 74 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  ontent to return
7390: 65 64 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ed is determined
73a0: 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65   by the paramete
73b0: 72 20 4a 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  r J.** which is 
73c0: 6f 6e 65 20 6f 66 20 74 68 65 20 53 54 41 54 5f  one of the STAT_
73d0: 47 45 54 5f 78 78 78 78 20 76 61 6c 75 65 73 20  GET_xxxx values 
73e0: 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a  defined above..*
73f0: 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 5f 67 65  *.** The stat_ge
7400: 74 28 50 2c 4a 29 20 66 75 6e 63 74 69 6f 6e 20  t(P,J) function 
7410: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
7420: 20 74 6f 20 67 65 6e 65 72 69 63 20 53 51 4c 2e   to generic SQL.
7430: 20 20 49 74 20 69 73 0a 2a 2a 20 69 6e 73 65 72    It is.** inser
7440: 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ted as part of a
7450: 20 6d 61 6e 75 61 6c 6c 79 20 63 6f 6e 73 74 72   manually constr
7460: 75 63 74 65 64 20 62 79 74 65 63 6f 64 65 20 70  ucted bytecode p
7470: 72 6f 67 72 61 6d 2e 20 20 28 53 65 65 0a 2a 2a  rogram.  (See.**
7480: 20 74 68 65 20 63 61 6c 6c 53 74 61 74 47 65 74   the callStatGet
7490: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
74a0: 2e 29 20 20 49 74 20 69 73 20 67 75 61 72 61 6e  .)  It is guaran
74b0: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 50 0a  teed that the P.
74c0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ** parameter wil
74d0: 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 70 6f  l always be a po
74e0: 69 6e 65 72 20 74 6f 20 61 20 53 74 61 74 34 41  iner to a Stat4A
74f0: 63 63 75 6d 20 6f 62 6a 65 63 74 2c 20 6e 65 76  ccum object, nev
7500: 65 72 20 61 0a 2a 2a 20 4e 55 4c 4c 2e 0a 2a 2a  er a.** NULL..**
7510: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 53  .** If neither S
7520: 54 41 54 33 20 6e 6f 72 20 53 54 41 54 34 20 61  TAT3 nor STAT4 a
7530: 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  re enabled, then
7540: 20 4a 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20   J is always.** 
7550: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 61  STAT_GET_STAT1 a
7560: 6e 64 20 69 73 20 68 65 6e 63 65 20 6f 6d 69 74  nd is hence omit
7570: 74 65 64 20 61 6e 64 20 74 68 69 73 20 72 6f 75  ted and this rou
7580: 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20  tine becomes.** 
7590: 61 20 6f 6e 65 2d 70 61 72 61 6d 65 74 65 72 20  a one-parameter 
75a0: 66 75 6e 63 74 69 6f 6e 2c 20 73 74 61 74 5f 67  function, stat_g
75b0: 65 74 28 50 29 2c 20 74 68 61 74 20 61 6c 77 61  et(P), that alwa
75c0: 79 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ys returns the.*
75d0: 2a 20 73 74 61 74 31 20 74 61 62 6c 65 20 65 6e  * stat1 table en
75e0: 74 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  try information.
75f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7600: 73 74 61 74 47 65 74 28 0a 20 20 73 71 6c 69 74  statGet(.  sqlit
7610: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7620: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7630: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7640: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61   **argv.){.  Sta
7650: 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74  t4Accum *p = (St
7660: 61 74 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65  at4Accum*)sqlite
7670: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
7680: 76 5b 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51  v[0]);.#ifdef SQ
7690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
76a0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20  3_OR_STAT4.  /* 
76b0: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 20  STAT3 and STAT4 
76c0: 68 61 76 65 20 61 20 70 61 72 61 6d 65 74 65 72  have a parameter
76d0: 20 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   on this routine
76e0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 43 61 6c 6c  . */.  int eCall
76f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7700: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
7710: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32   assert( argc==2
7720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43   );.  assert( eC
7730: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  all==STAT_GET_ST
7740: 41 54 31 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54  AT1 || eCall==ST
7750: 41 54 5f 47 45 54 5f 4e 45 51 20 0a 20 20 20 20  AT_GET_NEQ .    
7760: 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41     || eCall==STA
7770: 54 5f 47 45 54 5f 52 4f 57 49 44 20 7c 7c 20 65  T_GET_ROWID || e
7780: 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e  Call==STAT_GET_N
7790: 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61  LT.       || eCa
77a0: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 44 4c  ll==STAT_GET_NDL
77b0: 54 20 0a 20 20 29 3b 0a 20 20 69 66 28 20 65 43  T .  );.  if( eC
77c0: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  all==STAT_GET_ST
77d0: 41 54 31 20 29 0a 23 65 6c 73 65 0a 20 20 61 73  AT1 ).#else.  as
77e0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
77f0: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
7800: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  /* Return the va
7810: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 20  lue to store in 
7820: 74 68 65 20 22 73 74 61 74 22 20 63 6f 6c 75 6d  the "stat" colum
7830: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
7840: 73 74 61 74 31 0a 20 20 20 20 2a 2a 20 74 61 62  stat1.    ** tab
7850: 6c 65 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  le for this inde
7860: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
7870: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   The value is a 
7880: 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20  string composed 
7890: 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74  of a list of int
78a0: 65 67 65 72 73 20 64 65 73 63 72 69 62 69 6e 67  egers describing
78b0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64   .    ** the ind
78c0: 65 78 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  ex. The first in
78d0: 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73  teger in the lis
78e0: 74 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  t is the total n
78f0: 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a  umber of .    **
7900: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
7910: 69 6e 64 65 78 2e 20 54 68 65 72 65 20 69 73 20  index. There is 
7920: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  one additional i
7930: 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69  nteger in the li
7940: 73 74 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  st .    ** for e
7950: 61 63 68 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  ach indexed colu
7960: 6d 6e 2e 20 54 68 69 73 20 61 64 64 69 74 69 6f  mn. This additio
7970: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61  nal integer is a
7980: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 0a 20 20  n estimate of.  
7990: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
79a0: 6f 66 20 72 6f 77 73 20 6d 61 74 63 68 65 64 20  of rows matched 
79b0: 62 79 20 61 20 73 74 61 62 62 69 6e 67 20 71 75  by a stabbing qu
79c0: 65 72 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ery on the index
79d0: 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20   using.    ** a 
79e0: 6b 65 79 20 77 69 74 68 20 74 68 65 20 63 6f 72  key with the cor
79f0: 72 65 73 70 6f 6e 64 69 6e 67 20 6e 75 6d 62 65  responding numbe
7a00: 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 6e 20  r of fields. In 
7a10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
7a20: 20 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78   ** if the index
7a30: 20 69 73 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28   is on columns (
7a40: 61 2c 62 29 20 61 6e 64 20 74 68 65 20 73 71 6c  a,b) and the sql
7a50: 69 74 65 5f 73 74 61 74 31 20 76 61 6c 75 65 20  ite_stat1 value 
7a60: 69 73 20 0a 20 20 20 20 2a 2a 20 22 31 30 30 20  is .    ** "100 
7a70: 31 30 20 32 22 2c 20 74 68 65 6e 20 53 51 4c 69  10 2", then SQLi
7a80: 74 65 20 65 73 74 69 6d 61 74 65 73 20 74 68 61  te estimates tha
7a90: 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t:.    **.    **
7aa0: 20 20 20 2a 20 74 68 65 20 69 6e 64 65 78 20 63     * the index c
7ab0: 6f 6e 74 61 69 6e 73 20 31 30 30 20 72 6f 77 73  ontains 100 rows
7ac0: 2c 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48  ,.    **   * "WH
7ad0: 45 52 45 20 61 3d 3f 22 20 6d 61 74 63 68 65 73  ERE a=?" matches
7ae0: 20 31 30 20 72 6f 77 73 2c 20 61 6e 64 0a 20 20   10 rows, and.  
7af0: 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20    **   * "WHERE 
7b00: 61 3d 3f 20 41 4e 44 20 62 3d 3f 22 20 6d 61 74  a=? AND b=?" mat
7b10: 63 68 65 73 20 32 20 72 6f 77 73 2e 0a 20 20 20  ches 2 rows..   
7b20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 44 20   **.    ** If D 
7b30: 69 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  is the count of 
7b40: 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20  distinct values 
7b50: 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74  and K is the tot
7b60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  al number of .  
7b70: 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
7b80: 65 61 63 68 20 65 73 74 69 6d 61 74 65 20 69 73  each estimate is
7b90: 20 63 6f 6d 70 75 74 65 64 20 61 73 3a 0a 20 20   computed as:.  
7ba0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
7bb0: 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44     I = (K+D-1)/D
7bc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
7bd0: 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   *z;.    int i;.
7be0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20  .    char *zRet 
7bf0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
7c00: 65 72 6f 28 20 28 70 2d 3e 6e 4b 65 79 43 6f 6c  ero( (p->nKeyCol
7c10: 2b 31 29 2a 32 35 20 29 3b 0a 20 20 20 20 69 66  +1)*25 );.    if
7c20: 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zRet==0 ){.   
7c30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c40: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
7c50: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65  ntext);.      re
7c60: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
7c70: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7c80: 66 28 32 34 2c 20 7a 52 65 74 2c 20 22 25 6c 6c  f(24, zRet, "%ll
7c90: 75 22 2c 20 28 75 36 34 29 70 2d 3e 6e 52 6f 77  u", (u64)p->nRow
7ca0: 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52 65 74 20  );.    z = zRet 
7cb0: 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
7cc0: 30 28 7a 52 65 74 29 3b 0a 20 20 20 20 66 6f 72  0(zRet);.    for
7cd0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4b 65 79 43  (i=0; i<p->nKeyC
7ce0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7cf0: 75 36 34 20 6e 44 69 73 74 69 6e 63 74 20 3d 20  u64 nDistinct = 
7d00: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74  p->current.anDLt
7d10: 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20 20 20 75  [i] + 1;.      u
7d20: 36 34 20 69 56 61 6c 20 3d 20 28 70 2d 3e 6e 52  64 iVal = (p->nR
7d30: 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63 74 20 2d  ow + nDistinct -
7d40: 20 31 29 20 2f 20 6e 44 69 73 74 69 6e 63 74 3b   1) / nDistinct;
7d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7d60: 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22  nprintf(24, z, "
7d70: 20 25 6c 6c 75 22 2c 20 69 56 61 6c 29 3b 0a 20   %llu", iVal);. 
7d80: 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
7d90: 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
7da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63      assert( p->c
7db0: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 29  urrent.anEq[i] )
7dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
7dd0: 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26  rt( z[0]=='\0' &
7de0: 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a 20 20 20  & z>zRet );..   
7df0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7e00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
7e10: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  et, -1, sqlite3_
7e20: 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  free);.  }.#ifde
7e30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7e40: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
7e50: 20 65 6c 73 65 20 69 66 28 20 65 43 61 6c 6c 3d   else if( eCall=
7e60: 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20  =STAT_GET_ROWID 
7e70: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47  ){.    if( p->iG
7e80: 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 61  et<0 ){.      sa
7e90: 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73  mplePushPrevious
7ea0: 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  (p, 0);.      p-
7eb0: 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d  >iGet = 0;.    }
7ec0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47 65 74  .    if( p->iGet
7ed0: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  <p->nSample ){. 
7ee0: 20 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65       Stat4Sample
7ef0: 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b 20 70 2d   *pS = p->a + p-
7f00: 3e 69 47 65 74 3b 0a 20 20 20 20 20 20 69 66 28  >iGet;.      if(
7f10: 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d 30 20 29   pS->nRowid==0 )
7f20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7f30: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
7f40: 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e 69 52  ontext, pS->u.iR
7f50: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
7f60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7f70: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
7f80: 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e 61  context, pS->u.a
7f90: 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52 6f 77 69  Rowid, pS->nRowi
7fa0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
7fc0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
7ff0: 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b 0a  wcnt *aCnt = 0;.
8000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8010: 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20  iGet<p->nSample 
8020: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65  );.    switch( e
8030: 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  Call ){.      ca
8040: 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 3a  se STAT_GET_NEQ:
8050: 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d    aCnt = p->a[p-
8060: 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20 62 72 65  >iGet].anEq; bre
8070: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8080: 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20 20 61 43  TAT_GET_NLT:  aC
8090: 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65  nt = p->a[p->iGe
80a0: 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b 0a  t].anLt; break;.
80b0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
80c0: 0a 20 20 20 20 20 20 20 20 61 43 6e 74 20 3d 20  .        aCnt = 
80d0: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
80e0: 44 4c 74 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  DLt; .        p-
80f0: 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20  >iGet++;.       
8100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8110: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49      }..    if( I
8120: 73 53 74 61 74 33 20 29 7b 0a 20 20 20 20 20 20  sStat3 ){.      
8130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8140: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 69  nt64(context, (i
8150: 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a 20 20 20  64)aCnt[0]);.   
8160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
8170: 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74  ar *zRet = sqlit
8180: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e  e3MallocZero(p->
8190: 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20 20 20 20  nCol * 25);.    
81a0: 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b    if( zRet==0 ){
81b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
81c0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
81d0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
81e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
8200: 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65 74    char *z = zRet
8210: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
8220: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
8230: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
8240: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
8250: 34 2c 20 7a 2c 20 22 25 6c 6c 75 20 22 2c 20 28  4, z, "%llu ", (
8260: 75 36 34 29 61 43 6e 74 5b 69 5d 29 3b 0a 20 20  u64)aCnt[i]);.  
8270: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c          z += sql
8280: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
8290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
82a0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
82b0: 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20  ='\0' && z>zRet 
82c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b 2d 31 5d  );.        z[-1]
82d0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
82e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
82f0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
8300: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  et, -1, sqlite3_
8310: 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  free);.      }. 
8320: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
8330: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
8340: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
8350: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8360: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
8370: 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63  _PARAMETER( argc
8380: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   );.#endif.}.sta
8390: 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65  tic const FuncDe
83a0: 66 20 73 74 61 74 47 65 74 46 75 6e 63 64 65 66  f statGetFuncdef
83b0: 20 3d 20 7b 0a 20 20 31 2b 49 73 53 74 61 74 33   = {.  1+IsStat3
83c0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
83d0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
83e0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
83f0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
8400: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
8410: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
8420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
8430: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 47 65  Next */.  statGe
8440: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  t,         /* xS
8450: 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Func */.  0,    
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
8470: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
8480: 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f 2a  at_get",      /*
8490: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
84a0: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
84b0: 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62 65  callStatGet(Vdbe
84c0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61 74   *v, int regStat
84d0: 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20 69  4, int iParam, i
84e0: 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61 73  nt regOut){.  as
84f0: 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72 65  sert( regOut!=re
8500: 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75 74  gStat4 && regOut
8510: 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b 0a  !=regStat4+1 );.
8520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8530: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
8540: 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62  AT4.  sqlite3Vdb
8550: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8560: 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72  teger, iParam, r
8570: 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 69  egStat4+1);.#eli
8580: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8590: 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d 3d   assert( iParam=
85a0: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
85b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
85c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50 61  D_PARAMETER( iPa
85d0: 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ram );.#endif.  
85e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
85f0: 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
8600: 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c 20  0, 0, regStat4, 
8610: 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  regOut,.        
8620: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
8630: 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63 64  r*)&statGetFuncd
8640: 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
8650: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
8660: 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49 73  angeP5(v, 1 + Is
8670: 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat34);.}../*.*
8680: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8690: 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  to do an analysi
86a0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
86b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
86c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
86d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
86e0: 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62  id analyzeOneTab
86f0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
8700: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
8710: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
8720: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
8730: 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e  * Table whose in
8740: 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65 20  dices are to be 
8750: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
8760: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f  dex *pOnlyIdx, /
8770: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f  * If not NULL, o
8780: 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69 73  nly analyze this
8790: 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   one index */.  
87a0: 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20 20  int iStatCur,   
87b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62   /* Index of Vdb
87c0: 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72 69  eCursor that wri
87d0: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
87e0: 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
87f0: 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20 20  int iMem,       
8800: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
8810: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62  mory locations b
8820: 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  egin here */.  i
8830: 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20 20  nt iTab         
8840: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
8850: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  e cursor */.){. 
8860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8870: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a  Parse->db;    /*
8880: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
8890: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
88a0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
88b0: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74     /* An index t
88c0: 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  o being analyzed
88d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
88e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
88f0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
8900: 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e 67  n on index being
8910: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69   analyzed */.  i
8920: 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
8930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8940: 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  able cursor */. 
8950: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8970: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
8980: 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c 74  hine being built
8990: 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20   up */.  int i; 
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
89c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  unter */.  int j
89d0: 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20  ZeroRows = -1;  
89e0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
89f0: 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75 6d  from here if num
8a00: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20 7a  ber of rows is z
8a10: 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ero */.  int iDb
8a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8a40: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
8a50: 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20  ining pTab */.  
8a60: 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20  u8 needTableCnt 
8a70: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 1;         /* 
8a80: 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74 68  True to count th
8a90: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
8aa0: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 69   regNewRowid = i
8ab0: 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77  Mem++;    /* Row
8ac0: 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72  id for the inser
8ad0: 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ted record */.  
8ae0: 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20 69  int regStat4 = i
8af0: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8b00: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
8b10: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
8b20: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ct */.  int regC
8b30: 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  hng = iMem++;   
8b40: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8b50: 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20 66   changed index f
8b60: 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  ield */.#ifdef S
8b70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8b80: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e  T3_OR_STAT4.  in
8b90: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d 65  t regRowid = iMe
8ba0: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  m++;       /* Ro
8bb0: 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  wid argument pas
8bc0: 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73 68  sed to stat_push
8bd0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
8be0: 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d 65  nt regTemp = iMe
8bf0: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  m++;        /* T
8c00: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
8c10: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
8c20: 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d  egTabname = iMem
8c30: 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ++;     /* Regis
8c40: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
8c50: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  able name */.  i
8c60: 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d 20  nt regIdxname = 
8c70: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
8c80: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
8c90: 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  ng index name */
8ca0: 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31 20  .  int regStat1 
8cb0: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
8cc0: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68 65  /* Value for the
8cd0: 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   stat column of 
8ce0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a  sqlite_stat1 */.
8cf0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d 20    int regPrev = 
8d00: 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  iMem;          /
8d10: 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20 28  * MUST BE LAST (
8d20: 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 0a 20  see below) */.. 
8d30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
8d40: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
8d50: 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d 20 73  , iMem);.  v = s
8d60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
8d70: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
8d80: 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61 62 3d  0 || NEVER(pTab=
8d90: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
8da0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  n;.  }.  if( pTa
8db0: 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  b->tnum==0 ){.  
8dc0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68    /* Do not gath
8dd0: 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e  er statistics on
8de0: 20 76 69 65 77 73 20 6f 72 20 76 69 72 74 75 61   views or virtua
8df0: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  l tables */.    
8e00: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8e10: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
8e20: 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 70 54  e("sqlite_%", pT
8e30: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3d 3d 30  ab->zName, 0)==0
8e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
8e50: 74 20 67 61 74 68 65 72 20 73 74 61 74 69 73 74  t gather statist
8e60: 69 63 73 20 6f 6e 20 73 79 73 74 65 6d 20 74 61  ics on system ta
8e70: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  bles */.    retu
8e80: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
8e90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
8ea0: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
8eb0: 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ) );.  iDb = sql
8ec0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
8ed0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
8ee0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
8ef0: 69 44 62 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  iDb>=0 );.  asse
8f00: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
8f10: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
8f20: 44 62 2c 20 30 29 20 29 3b 0a 23 69 66 6e 64 65  Db, 0) );.#ifnde
8f30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
8f40: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
8f50: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
8f60: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
8f70: 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54 61 62 2d  E_ANALYZE, pTab-
8f80: 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
8f90: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
8fa0: 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  bSName ) ){.    
8fb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8fc0: 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69  if..  /* Establi
8fd0: 73 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  sh a read-lock o
8fe0: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 74  n the table at t
8ff0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
9000: 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a 20 4f 70 65  level. .  ** Ope
9010: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
9020: 72 73 6f 72 20 6f 6e 20 74 68 65 20 74 61 62 6c  rsor on the tabl
9030: 65 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  e. Also allocate
9040: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
9050: 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  .  ** to use for
9060: 20 73 63 61 6e 6e 69 6e 67 20 69 6e 64 65 78 65   scanning indexe
9070: 73 20 28 69 49 64 78 43 75 72 29 2e 20 4e 6f 20  s (iIdxCur). No 
9080: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
9090: 6f 70 65 6e 65 64 20 61 74 0a 20 20 2a 2a 20 74  opened at.  ** t
90a0: 68 69 73 20 74 69 6d 65 20 74 68 6f 75 67 68 2e  his time though.
90b0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61    */.  sqlite3Ta
90c0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
90d0: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
90e0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
90f0: 3b 0a 20 20 69 54 61 62 43 75 72 20 3d 20 69 54  ;.  iTabCur = iT
9100: 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75 72 20  ab++;.  iIdxCur 
9110: 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 70 50 61 72  = iTab++;.  pPar
9120: 73 65 2d 3e 6e 54 61 62 20 3d 20 4d 41 58 28 70  se->nTab = MAX(p
9130: 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20 69 54 61  Parse->nTab, iTa
9140: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65  b);.  sqlite3Ope
9150: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
9160: 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61  TabCur, iDb, pTa
9170: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
9180: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f  .  sqlite3VdbeLo
9190: 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 54  adString(v, regT
91a0: 61 62 6e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  abname, pTab->zN
91b0: 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 70 49 64  ame);..  for(pId
91c0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
91d0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
91e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
91f0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9210: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9220: 69 6e 20 70 49 64 78 2e 20 22 4e 22 20 2a 2f 0a  in pIdx. "N" */.
9230: 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 77 69      int addrRewi
9240: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
9250: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
9260: 22 4f 50 5f 52 65 77 69 6e 64 20 69 49 64 78 43  "OP_Rewind iIdxC
9270: 75 72 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ur" */.    int a
9280: 64 64 72 4e 65 78 74 52 6f 77 3b 20 20 20 20 20  ddrNextRow;     
9290: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
92a0: 65 73 73 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77  ess of "next_row
92b0: 3a 22 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  :" */.    const 
92c0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 3b 20  char *zIdxName; 
92d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
92e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
92f0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 54 65 73 74      int nColTest
9300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9320: 6f 6c 75 6d 6e 73 20 74 6f 20 74 65 73 74 20 66  olumns to test f
9330: 6f 72 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  or changes */.. 
9340: 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20     if( pOnlyIdx 
9350: 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70 49 64  && pOnlyIdx!=pId
9360: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
9370: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
9380: 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20 6e  tIdxWhere==0 ) n
9390: 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 30 3b  eedTableCnt = 0;
93a0: 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
93b0: 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
93c0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
93d0: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  dx) ){.      nCo
93e0: 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l = pIdx->nKeyCo
93f0: 6c 3b 0a 20 20 20 20 20 20 7a 49 64 78 4e 61 6d  l;.      zIdxNam
9400: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
9410: 0a 20 20 20 20 20 20 6e 43 6f 6c 54 65 73 74 20  .      nColTest 
9420: 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
9430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f  }else{.      nCo
9440: 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
9450: 6e 3b 0a 20 20 20 20 20 20 7a 49 64 78 4e 61 6d  n;.      zIdxNam
9460: 65 20 3d 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3b  e = pIdx->zName;
9470: 0a 20 20 20 20 20 20 6e 43 6f 6c 54 65 73 74 20  .      nColTest 
9480: 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
9490: 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79  ull ? pIdx->nKey
94a0: 43 6f 6c 2d 31 20 3a 20 6e 43 6f 6c 2d 31 3b 0a  Col-1 : nCol-1;.
94b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
94c0: 70 75 6c 61 74 65 20 74 68 65 20 72 65 67 69 73  pulate the regis
94d0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
94e0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 2a  he index name. *
94f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
9500: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72  eLoadString(v, r
9510: 65 67 49 64 78 6e 61 6d 65 2c 20 7a 49 64 78 4e  egIdxname, zIdxN
9520: 61 6d 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ame);.    VdbeCo
9530: 6d 6d 65 6e 74 28 28 76 2c 20 22 41 6e 61 6c 79  mment((v, "Analy
9540: 73 69 73 20 66 6f 72 20 25 73 2e 25 73 22 2c 20  sis for %s.%s", 
9550: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 64  pTab->zName, zId
9560: 78 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  xName));..    /*
9570: 0a 20 20 20 20 2a 2a 20 50 73 65 75 64 6f 2d 63  .    ** Pseudo-c
9580: 6f 64 65 20 66 6f 72 20 6c 6f 6f 70 20 74 68 61  ode for loop tha
9590: 74 20 63 61 6c 6c 73 20 73 74 61 74 5f 70 75 73  t calls stat_pus
95a0: 68 28 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  h():.    **.    
95b0: 2a 2a 20 20 20 52 65 77 69 6e 64 20 63 73 72 0a  **   Rewind csr.
95c0: 20 20 20 20 2a 2a 20 20 20 69 66 20 65 6f 66 28      **   if eof(
95d0: 63 73 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  csr) goto end_of
95e0: 5f 73 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20  _scan;.    **   
95f0: 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20  regChng = 0.    
9600: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
9610: 64 64 72 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20  ddr_0;.    **.  
9620: 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a    **  next_row:.
9630: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9640: 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 0.    **   if
9650: 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67 50  ( idx(0) != regP
9660: 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63 68  rev(0) ) goto ch
9670: 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 2a 2a  ng_addr_0.    **
9680: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31 0a 20     regChng = 1. 
9690: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
96a0: 31 29 20 21 3d 20 72 65 67 50 72 65 76 28 31 29  1) != regPrev(1)
96b0: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
96c0: 72 5f 31 0a 20 20 20 20 2a 2a 20 20 20 2e 2e 2e  r_1.    **   ...
96d0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
96e0: 67 20 3d 20 4e 0a 20 20 20 20 2a 2a 20 20 20 67  g = N.    **   g
96f0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 4e 0a  oto chng_addr_N.
9700: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63      **.    **  c
9710: 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20  hng_addr_0:.    
9720: 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30 29 20  **   regPrev(0) 
9730: 3d 20 69 64 78 28 30 29 0a 20 20 20 20 2a 2a 20  = idx(0).    ** 
9740: 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20   chng_addr_1:.  
9750: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31    **   regPrev(1
9760: 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20 2a  ) = idx(1).    *
9770: 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20  *  ....    **.  
9780: 20 20 2a 2a 20 20 65 6e 64 44 69 73 74 69 6e 63    **  endDistinc
9790: 74 54 65 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20  tTest:.    **   
97a0: 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78 28 72  regRowid = idx(r
97b0: 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20 20 73  owid).    **   s
97c0: 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65 67 43  tat_push(P, regC
97d0: 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29 0a 20  hng, regRowid). 
97e0: 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72     **   Next csr
97f0: 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f  .    **   if !eo
9800: 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74  f(csr) goto next
9810: 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  _row;.    **.   
9820: 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f 73 63 61 6e   **  end_of_scan
9830: 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a  :.    */..    /*
9840: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
9850: 20 61 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f   are enough memo
9860: 72 79 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ry cells allocat
9870: 65 64 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  ed to accommodat
9880: 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  e .    ** the re
9890: 67 50 72 65 76 20 61 72 72 61 79 20 61 6e 64 20  gPrev array and 
98a0: 61 20 74 72 61 69 6c 69 6e 67 20 72 6f 77 69 64  a trailing rowid
98b0: 20 28 74 68 65 20 72 6f 77 69 64 20 73 6c 6f 74   (the rowid slot
98c0: 20 69 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   is required.   
98d0: 20 2a 2a 20 77 68 65 6e 20 62 75 69 6c 64 69 6e   ** when buildin
98e0: 67 20 61 20 72 65 63 6f 72 64 20 74 6f 20 69 6e  g a record to in
98f0: 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 73 61  sert into the sa
9900: 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 0a  mple column of .
9910: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
9920: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 20  e_stat4 table.  
9930: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
9940: 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65  Mem = MAX(pParse
9950: 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->nMem, regPrev+
9960: 6e 43 6f 6c 54 65 73 74 29 3b 0a 0a 20 20 20 20  nColTest);..    
9970: 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
9980: 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  nly cursor on th
9990: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  e index being an
99a0: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61  alyzed. */.    a
99b0: 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69  ssert( iDb==sqli
99c0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
99d0: 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  (db, pIdx->pSche
99e0: 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ma) );.    sqlit
99f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9a00: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
9a10: 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  xCur, pIdx->tnum
9a20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
9a30: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
9a40: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
9a50: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
9a60: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
9a70: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  x->zName));..   
9a80: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73   /* Invoke the s
9a90: 74 61 74 5f 69 6e 69 74 28 29 20 66 75 6e 63 74  tat_init() funct
9aa0: 69 6f 6e 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ion. The argumen
9ab0: 74 73 20 61 72 65 3a 0a 20 20 20 20 2a 2a 20 0a  ts are:.    ** .
9ac0: 20 20 20 20 2a 2a 20 20 20 20 28 31 29 20 74 68      **    (1) th
9ad0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9ae0: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
9af0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72   including the r
9b00: 6f 77 69 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  owid.    **     
9b10: 20 20 20 28 6f 72 20 66 6f 72 20 61 20 57 49 54     (or for a WIT
9b20: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
9b30: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
9b40: 50 4b 20 63 6f 6c 75 6d 6e 73 29 2c 0a 20 20 20  PK columns),.   
9b50: 20 2a 2a 20 20 20 20 28 32 29 20 74 68 65 20 6e   **    (2) the n
9b60: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9b70: 20 69 6e 20 74 68 65 20 6b 65 79 20 77 69 74 68   in the key with
9b80: 6f 75 74 20 74 68 65 20 72 6f 77 69 64 2f 70 6b  out the rowid/pk
9b90: 0a 20 20 20 20 2a 2a 20 20 20 20 28 33 29 20 74  .    **    (3) t
9ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9bb0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
9bc0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 0a 20 20      **.    **.  
9bd0: 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61    ** The third a
9be0: 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20  rgument is only 
9bf0: 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20 61  used for STAT3 a
9c00: 6e 64 20 53 54 41 54 34 0a 20 20 20 20 2a 2f 0a  nd STAT4.    */.
9c10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9c20: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
9c30: 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT4.    sqlite3V
9c40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9c50: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2c 20  Count, iIdxCur, 
9c60: 72 65 67 53 74 61 74 34 2b 33 29 3b 0a 23 65 6e  regStat4+3);.#en
9c70: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
9c80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9c90: 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 2c 20 72  Integer, nCol, r
9ca0: 65 67 53 74 61 74 34 2b 31 29 3b 0a 20 20 20 20  egStat4+1);.    
9cb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9cc0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9cd0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
9ce0: 72 65 67 53 74 61 74 34 2b 32 29 3b 0a 20 20 20  regStat4+2);.   
9cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9d00: 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
9d10: 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2b  n0, 0, regStat4+
9d20: 31 2c 20 72 65 67 53 74 61 74 34 2c 0a 20 20 20  1, regStat4,.   
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 28 63 68 61 72 2a 29 26 73 74 61 74 49 6e    (char*)&statIn
9d50: 69 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55  itFuncdef, P4_FU
9d60: 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
9d70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9d80: 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29 3b 0a  v, 2+IsStat34);.
9d90: 0a 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  .    /* Implemen
9da0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  tation of the fo
9db0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  llowing:.    **.
9dc0: 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64 20      **   Rewind 
9dd0: 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20  csr.    **   if 
9de0: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 65 6e  eof(csr) goto en
9df0: 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20 20 2a  d_of_scan;.    *
9e00: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a  *   regChng = 0.
9e10: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 6e 65      **   goto ne
9e20: 78 74 5f 70 75 73 68 5f 30 3b 0a 20 20 20 20 2a  xt_push_0;.    *
9e30: 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64  *.    */.    add
9e40: 72 52 65 77 69 6e 64 20 3d 20 73 71 6c 69 74 65  rRewind = sqlite
9e50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
9e60: 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75  P_Rewind, iIdxCu
9e70: 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  r);.    VdbeCove
9e80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
9e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9ea0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9eb0: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 61   regChng);.    a
9ec0: 64 64 72 4e 65 78 74 52 6f 77 20 3d 20 73 71 6c  ddrNextRow = sql
9ed0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9ee0: 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 69 66 28  ddr(v);..    if(
9ef0: 20 6e 43 6f 6c 54 65 73 74 3e 30 20 29 7b 0a 20   nColTest>0 ){. 
9f00: 20 20 20 20 20 69 6e 74 20 65 6e 64 44 69 73 74       int endDist
9f10: 69 6e 63 74 54 65 73 74 20 3d 20 73 71 6c 69 74  inctTest = sqlit
9f20: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
9f30: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  v);.      int *a
9f40: 47 6f 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20  GotoChng;       
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
9f60: 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   of jump instruc
9f70: 74 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a  tion addresses *
9f80: 2f 0a 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e  /.      aGotoChn
9f90: 67 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  g = sqlite3DbMal
9fa0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9fb0: 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73  eof(int)*nColTes
9fc0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47  t);.      if( aG
9fd0: 6f 74 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e  otoChng==0 ) con
9fe0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
9ff0: 0a 20 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f  .      **  next_
a000: 72 6f 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  row:.      **   
a010: 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20  regChng = 0.    
a020: 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30    **   if( idx(0
a030: 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20  ) != regPrev(0) 
a040: 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72  ) goto chng_addr
a050: 5f 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  _0.      **   re
a060: 67 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20  gChng = 1.      
a070: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 31 29 20  **   if( idx(1) 
a080: 21 3d 20 72 65 67 50 72 65 76 28 31 29 20 29 20  != regPrev(1) ) 
a090: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31  goto chng_addr_1
a0a0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a  .      **   ....
a0b0: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68        **   regCh
a0c0: 6e 67 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20  ng = N.      ** 
a0d0: 20 20 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e    goto endDistin
a0e0: 63 74 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a  ctTest.      */.
a0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a100: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
a110: 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e  to);.      addrN
a120: 65 78 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  extRow = sqlite3
a130: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a140: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  v);.      if( nC
a150: 6f 6c 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64  olTest==1 && pId
a160: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
a170: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
a180: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
a190: 2f 2a 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d  /* For a single-
a1a0: 63 6f 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e  column UNIQUE in
a1b0: 64 65 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76  dex, once we hav
a1c0: 65 20 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55  e found a non-NU
a1d0: 4c 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  LL.        ** ro
a1e0: 77 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  w, we know that 
a1f0: 61 6c 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c  all the rest wil
a200: 6c 20 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73  l be distinct, s
a210: 6f 20 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20  o skip .        
a220: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 64 69  ** subsequent di
a230: 73 74 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73  stinctness tests
a240: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
a250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a260: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65  , OP_NotNull, re
a270: 67 50 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e  gPrev, endDistin
a280: 63 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ctTest);.       
a290: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54  for(i=0; i<nColT
a2c0: 65 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  est; i++){.     
a2d0: 20 20 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d     char *pColl =
a2e0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c   (char*)sqlite3L
a2f0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a300: 72 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  rse, pIdx->azCol
a310: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  l[i]);.        s
a320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a330: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a340: 69 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20  i, regChng);.   
a350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a360: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a370: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
a380: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
a390: 20 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20     aGotoChng[i] 
a3a0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
a3b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a3c0: 4f 50 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20  OP_Ne, regTemp, 
a3d0: 30 2c 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43  0, regPrev+i, pC
a3e0: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
a3f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a400: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a410: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
a420: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a430: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a440: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a460: 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73  Integer, nColTes
a470: 74 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20  t, regChng);.   
a480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a490: 74 6f 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63  to(v, endDistinc
a4a0: 74 54 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20  tTest);.  .  .  
a4b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20      /*.      ** 
a4c0: 20 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20   chng_addr_0:.  
a4d0: 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76      **   regPrev
a4e0: 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20  (0) = idx(0).   
a4f0: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
a500: 5f 31 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  _1:.      **   r
a510: 65 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28  egPrev(1) = idx(
a520: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e  1).      **  ...
a530: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a540: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a550: 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52  ere(v, addrNextR
a560: 6f 77 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  ow-1);.      for
a570: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74  (i=0; i<nColTest
a580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a590: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a5a0: 65 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67  ere(v, aGotoChng
a5b0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
a5c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a5d0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
a5e0: 64 78 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65  dxCur, i, regPre
a5f0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v+i);.      }.  
a600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
a610: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
a620: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b  ndDistinctTest);
a630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a640: 46 72 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68  Free(db, aGotoCh
a650: 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ng);.    }.  .  
a660: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e    /*.    **  chn
a670: 67 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a  g_addr_N:.    **
a680: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64     regRowid = id
a690: 78 28 72 6f 77 69 64 29 20 20 20 20 20 20 20 20  x(rowid)        
a6a0: 20 20 20 20 2f 2f 20 53 54 41 54 33 34 20 6f 6e      // STAT34 on
a6b0: 6c 79 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74  ly.    **   stat
a6c0: 5f 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67  _push(P, regChng
a6d0: 2c 20 72 65 67 52 6f 77 69 64 29 20 20 2f 2f 20  , regRowid)  // 
a6e0: 33 72 64 20 70 61 72 61 6d 65 74 65 72 20 53 54  3rd parameter ST
a6f0: 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  AT34 only.    **
a700: 20 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20     Next csr.    
a710: 2a 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72  **   if !eof(csr
a720: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b  ) goto next_row;
a730: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
a740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
a750: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
a760: 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 69 64  assert( regRowid
a770: 3d 3d 28 72 65 67 53 74 61 74 34 2b 32 29 20 29  ==(regStat4+2) )
a780: 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77  ;.    if( HasRow
a790: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
a7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a7b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
a7c0: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  id, iIdxCur, reg
a7d0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
a7e0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
a7f0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
a800: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
a810: 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  x->pTable);.    
a820: 20 20 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b    int j, k, regK
a830: 65 79 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79  ey;.      regKey
a840: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a850: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
a860: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
a870: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a880: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
a890: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
a8a0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
a8b0: 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
a8c0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d       assert( k>=
a8e0: 30 20 26 26 20 6b 3c 70 54 61 62 2d 3e 6e 43 6f  0 && k<pTab->nCo
a8f0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
a900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a910: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
a920: 78 43 75 72 2c 20 6b 2c 20 72 65 67 4b 65 79 2b  xCur, k, regKey+
a930: 6a 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  j);.        Vdbe
a940: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
a950: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b  , pTab->aCol[pPk
a960: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
a970: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
a980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a990: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
a9a0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4b 65 79  keRecord, regKey
a9b0: 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  , pPk->nKeyCol, 
a9c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
a9d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a9e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
a9f0: 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b   regKey, pPk->nK
aa00: 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23 65  eyCol);.    }.#e
aa10: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
aa20: 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67 53 74   regChng==(regSt
aa30: 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20 73 71  at4+1) );.    sq
aa40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
aa50: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
aa60: 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65   1, regStat4, re
aa70: 67 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  gTemp,.         
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
aa90: 72 2a 29 26 73 74 61 74 50 75 73 68 46 75 6e 63  r*)&statPushFunc
aaa0: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
aab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aac0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
aad0: 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20 73 71  sStat34);.    sq
aae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aaf0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
ab00: 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52 6f 77  Cur, addrNextRow
ab10: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ab20: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  v);..    /* Add 
ab30: 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
ab40: 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20 2a 2f   stat1 table. */
ab50: 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74  .    callStatGet
ab60: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
ab70: 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20 72 65  AT_GET_STAT1, re
ab80: 67 53 74 61 74 31 29 3b 0a 20 20 20 20 61 73 73  gStat1);.    ass
ab90: 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53  ert( "BBB"[0]==S
aba0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
abb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
abc0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
abd0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62  keRecord, regTab
abe0: 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70  name, 3, regTemp
abf0: 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20 20 20  , "BBB", 0);.   
ac00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac10: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ac20: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
ac30: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  NewRowid);.    s
ac40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
ac60: 53 74 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70  StatCur, regTemp
ac70: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
ac80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ac90: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
aca0: 47 5f 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20  G_APPEND);..    
acb0: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 69  /* Add the entri
acc0: 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 33 20  es to the stat3 
acd0: 6f 72 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  or stat4 table. 
ace0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
acf0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ad00: 5f 53 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20  _STAT4.    {.   
ad10: 20 20 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72     int regEq = r
ad20: 65 67 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69  egStat1;.      i
ad30: 6e 74 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74  nt regLt = regSt
ad40: 61 74 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  at1+1;.      int
ad50: 20 72 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61   regDLt = regSta
ad60: 74 31 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+2;.      int 
ad70: 72 65 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53  regSample = regS
ad80: 74 61 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e  tat1+3;.      in
ad90: 74 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74  t regCol = regSt
ada0: 61 74 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74  at1+4;.      int
adb0: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20   regSampleRowid 
adc0: 3d 20 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b  = regCol + nCol;
add0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e  .      int addrN
ade0: 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  ext;.      int a
adf0: 64 64 72 49 73 4e 75 6c 6c 3b 0a 20 20 20 20 20  ddrIsNull;.     
ae00: 20 75 38 20 73 65 65 6b 4f 70 20 3d 20 48 61 73   u8 seekOp = Has
ae10: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 4f 50  Rowid(pTab) ? OP
ae20: 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f 50 5f  _NotExists : OP_
ae30: 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 20 20 20  NotFound;..     
ae40: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
ae50: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
ae60: 2c 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 29 3b 0a  , regCol+nCol);.
ae70: 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
ae80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ae90: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
aea0: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
aeb0: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
aec0: 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65 67 53  _GET_ROWID, regS
aed0: 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20  ampleRowid);.   
aee0: 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20     addrIsNull = 
aef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af00: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
af10: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b  regSampleRowid);
af20: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
af30: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 63 61  age(v);.      ca
af40: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
af50: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
af60: 4e 45 51 2c 20 72 65 67 45 71 29 3b 0a 20 20 20  NEQ, regEq);.   
af70: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
af80: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
af90: 5f 47 45 54 5f 4e 4c 54 2c 20 72 65 67 4c 74 29  _GET_NLT, regLt)
afa0: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
afb0: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
afc0: 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 2c 20   STAT_GET_NDLT, 
afd0: 72 65 67 44 4c 74 29 3b 0a 20 20 20 20 20 20 73  regDLt);.      s
afe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
aff0: 49 6e 74 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69  Int(v, seekOp, i
b000: 54 61 62 43 75 72 2c 20 61 64 64 72 4e 65 78 74  TabCur, addrNext
b010: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
b020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 57  , 0);.      /* W
b030: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
b040: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 72  regSampleRowid r
b050: 6f 77 20 65 78 69 73 74 73 20 62 65 63 61 75 73  ow exists becaus
b060: 65 20 69 74 20 77 61 73 20 72 65 61 64 20 62 79  e it was read by
b070: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
b080: 65 76 69 6f 75 73 20 6c 6f 6f 70 2e 20 20 54 68  evious loop.  Th
b090: 75 73 20 74 68 65 20 6e 6f 74 2d 66 6f 75 6e 64  us the not-found
b0a0: 20 6a 75 6d 70 20 6f 66 20 73 65 65 6b 4f 70 20   jump of seekOp 
b0b0: 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 20  will never.     
b0c0: 20 2a 2a 20 62 65 20 74 61 6b 65 6e 20 2a 2f 0a   ** be taken */.
b0d0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b0e0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
b0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b100: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
b110: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b120: 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
b130: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
b140: 54 61 62 43 75 72 2c 20 30 2c 20 72 65 67 53 61  TabCur, 0, regSa
b150: 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  mple);.#else.   
b160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b170: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b190: 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
b1a0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
b1b0: 54 61 62 43 75 72 2c 20 69 2c 20 72 65 67 43 6f  TabCur, i, regCo
b1c0: 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l+i);.      }.  
b1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
b1f0: 52 65 63 6f 72 64 2c 20 72 65 67 43 6f 6c 2c 20  Record, regCol, 
b200: 6e 43 6f 6c 2c 20 72 65 67 53 61 6d 70 6c 65 29  nCol, regSample)
b210: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  ;.#endif.      s
b220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b230: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b240: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36  d, regTabname, 6
b250: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
b260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b270: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
b280: 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  id, iStatCur+1, 
b290: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
b2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b2c0: 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  rt, iStatCur+1, 
b2d0: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
b2e0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b300: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64  , OP_Goto, 1, ad
b310: 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d  drNext); /* P1==
b320: 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  1 for end-of-loo
b330: 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  p */.      sqlit
b340: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b350: 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20  , addrIsNull);. 
b360: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
b370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
b380: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
b390: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6e      /* End of an
b3a0: 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 73 71  alysis */.    sq
b3b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b3c0: 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e 64 29  e(v, addrRewind)
b3d0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65  ;.  }...  /* Cre
b3e0: 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73 71 6c  ate a single sql
b3f0: 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20  ite_stat1 entry 
b400: 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20  containing NULL 
b410: 61 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  as the index.  *
b420: 2a 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 72  * name and the r
b430: 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68 65 20  ow count as the 
b440: 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  content..  */.  
b450: 69 66 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20  if( pOnlyIdx==0 
b460: 26 26 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20  && needTableCnt 
b470: 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  ){.    VdbeComme
b480: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61  nt((v, "%s", pTa
b490: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
b4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4b0: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
b4c0: 54 61 62 43 75 72 2c 20 72 65 67 53 74 61 74 31  TabCur, regStat1
b4d0: 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73  );.    jZeroRows
b4e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b4f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
b500: 2c 20 72 65 67 53 74 61 74 31 29 3b 20 56 64 62  , regStat1); Vdb
b510: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b530: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b540: 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a  0, regIdxname);.
b550: 20 20 20 20 61 73 73 65 72 74 28 20 22 42 42 42      assert( "BBB
b560: 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  "[0]==SQLITE_AFF
b570: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c  _TEXT );.    sql
b580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b590: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b5a0: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20   regTabname, 3, 
b5b0: 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20  regTemp, "BBB", 
b5c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b5d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b5e0: 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43  NewRowid, iStatC
b5f0: 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  ur, regNewRowid)
b600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b620: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20  sert, iStatCur, 
b630: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
b640: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
b650: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b660: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
b670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b680: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65  eJumpHere(v, jZe
b690: 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  roRows);.  }.}..
b6a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b6b0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
b6c0: 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ause the most re
b6d0: 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79  cent index analy
b6e0: 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61  sis to.** be loa
b6f0: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61  ded into interna
b700: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 77 68  l hash tables wh
b710: 65 72 65 20 69 73 20 63 61 6e 20 62 65 20 75 73  ere is can be us
b720: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b730: 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  id loadAnalysis(
b740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
b750: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
b760: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b770: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
b780: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b7a0: 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73   OP_LoadAnalysis
b7b0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , iDb);.  }.}../
b7c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
b7d0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20  de that will do 
b7e0: 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61  an analysis of a
b7f0: 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
b800: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
b810: 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65   analyzeDatabase
b820: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b830: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
b840: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b850: 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a  ->db;.  Schema *
b860: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
b870: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20  b[iDb].pSchema; 
b880: 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20     /* Schema of 
b890: 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a  database iDb */.
b8a0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20    HashElem *k;. 
b8b0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20   int iStatCur;. 
b8c0: 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74   int iMem;.  int
b8d0: 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74 65   iTab;..  sqlite
b8e0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
b8f0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
b900: 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72  iDb);.  iStatCur
b910: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
b920: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
b930: 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74  += 3;.  openStat
b940: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
b950: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30 2c 20  b, iStatCur, 0, 
b960: 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61  0);.  iMem = pPa
b970: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69  rse->nMem+1;.  i
b980: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
b990: 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ab;.  assert( sq
b9a0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
b9b0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
b9c0: 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69   );.  for(k=sqli
b9d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
b9e0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
b9f0: 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
ba00: 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62  ext(k)){.    Tab
ba10: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
ba20: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
ba30: 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a  a(k);.    analyz
ba40: 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65  eOneTable(pParse
ba50: 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74  , pTab, 0, iStat
ba60: 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62 29  Cur, iMem, iTab)
ba70: 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c  ;.  }.  loadAnal
ba80: 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62  ysis(pParse, iDb
ba90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
baa0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
bab0: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
bac0: 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  is of a single t
bad0: 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74  able in.** a dat
bae0: 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79  abase.  If pOnly
baf0: 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Idx is not NULL 
bb00: 74 68 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e  then it is a sin
bb10: 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20  gle index.** in 
bb20: 70 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64  pTab that should
bb30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f   be analyzed..*/
bb40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
bb50: 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20  lyzeTable(Parse 
bb60: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
bb70: 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e  pTab, Index *pOn
bb80: 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44  lyIdx){.  int iD
bb90: 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75  b;.  int iStatCu
bba0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  r;..  assert( pT
bbb0: 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
bbc0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
bbd0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
bbe0: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
bbf0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
bc00: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
bc10: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
bc20: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
bc30: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
bc40: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
bc50: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
bc60: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
bc70: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
bc80: 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79  = 3;.  if( pOnly
bc90: 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53  Idx ){.    openS
bca0: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
bcb0: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
bcc0: 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c  pOnlyIdx->zName,
bcd0: 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65   "idx");.  }else
bce0: 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61  {.    openStatTa
bcf0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
bd00: 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d   iStatCur, pTab-
bd10: 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a  >zName, "tbl");.
bd20: 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65    }.  analyzeOne
bd30: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
bd40: 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53  ab, pOnlyIdx, iS
bd50: 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d 3e 6e  tatCur,pParse->n
bd60: 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e 54  Mem+1,pParse->nT
bd70: 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79  ab);.  loadAnaly
bd80: 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29  sis(pParse, iDb)
bd90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
bda0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
bdb0: 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
bdc0: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61  .  The parser ca
bdd0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
bde0: 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f  .** when it reco
bdf0: 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a  gnizes an ANALYZ
be00: 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
be10: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
be40: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
be50: 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20  E  <database>   
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
be70: 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  2.**        ANAL
be80: 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  YZE  ?<database>
be90: 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
bea0: 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 3.**.** Form 1
beb0: 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
bec0: 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
bed0: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
bee0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a   be analyzed..**
bef0: 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73   Form 2 analyzes
bf00: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65   all indices the
bf10: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
bf20: 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20   named..** Form 
bf30: 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69  3 analyzes all i
bf40: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
bf50: 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
bf60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
bf70: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50  sqlite3Analyze(P
bf80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
bf90: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
bfa0: 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73  en *pName2){.  s
bfb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
bfc0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
bfd0: 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  Db;.  int i;.  c
bfe0: 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20  har *z, *zDb;.  
bff0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c000: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 6f  ndex *pIdx;.  To
c010: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b  ken *pTableName;
c020: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 2f  .  Vdbe *v;..  /
c030: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
c040: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
c050: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c060: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
c070: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
c080: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
c090: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
c0a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
c0b0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
c0c0: 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65 2d  lMutexes(pParse-
c0d0: 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51  >db) );.  if( SQ
c0e0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
c0f0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
c100: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
c110: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
c120: 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70 4e   pName2!=0 || pN
c130: 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ame1==0 );.  if(
c140: 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
c150: 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e    /* Form 1:  An
c160: 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alyze everything
c170: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
c180: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c190: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  {.      if( i==1
c1a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
c1b0: 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20   Do not analyze 
c1c0: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
c1d0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79  e */.      analy
c1e0: 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73  zeDatabase(pPars
c1f0: 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
c200: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 2d  else if( pName2-
c210: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
c220: 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a 65  Form 2:  Analyze
c230: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
c240: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f 0a   table named */.
c250: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
c260: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
c270: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
c280: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 6e 61  >=0 ){.      ana
c290: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61  lyzeDatabase(pPa
c2a0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  rse, iDb);.    }
c2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
c2c0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
c2d0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31 29  oken(db, pName1)
c2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
c2f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
c300: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
c310: 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 30 29 29  Index(db, z, 0))
c320: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
c330: 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50   analyzeTable(pP
c340: 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  arse, pIdx->pTab
c350: 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  le, pIdx);.     
c360: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
c370: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
c380: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
c390: 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a  0, z, 0))!=0 ){.
c3a0: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c3b0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c3c0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
c3d0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
c3e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
c3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
c410: 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74  orm 3: Analyze t
c420: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
c430: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ed table name */
c440: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
c450: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
c460: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c470: 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d  ame2, &pTableNam
c480: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  e);.    if( iDb>
c490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20  =0 ){.      zDb 
c4a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
c4b0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a  DbSName;.      z
c4c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
c4d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
c4e0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  leName);.      i
c4f0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
c500: 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69  if( (pIdx = sqli
c510: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
c520: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
c530: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c540: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c550: 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64  Idx->pTable, pId
c560: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
c570: 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71  e if( (pTab = sq
c580: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
c590: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a  (pParse, 0, z, z
c5a0: 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Db))!=0 ){.     
c5b0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
c5c0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
c5d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
c5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c5f0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
c600: 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d    }.    }   .  }
c610: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c620: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c630: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
c640: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c650: 5f 45 78 70 69 72 65 29 3b 0a 7d 0a 0a 2f 2a 0a  _Expire);.}../*.
c660: 2a 2a 20 55 73 65 64 20 74 6f 20 70 61 73 73 20  ** Used to pass 
c670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
c680: 20 74 68 65 20 61 6e 61 6c 79 7a 65 72 20 72 65   the analyzer re
c690: 61 64 65 72 20 74 68 72 6f 75 67 68 20 74 6f 20  ader through to 
c6a0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  the.** callback 
c6b0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
c6c0: 64 65 66 20 73 74 72 75 63 74 20 61 6e 61 6c 79  def struct analy
c6d0: 73 69 73 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73  sisInfo analysis
c6e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61  Info;.struct ana
c6f0: 6c 79 73 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71  lysisInfo {.  sq
c700: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
c710: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
c720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  se;.};../*.** Th
c730: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c740: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
c750: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c760: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ng containing a.
c770: 2a 2a 20 6c 69 73 74 20 6f 66 20 73 70 61 63 65  ** list of space
c780: 20 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67   separated integ
c790: 65 72 73 2e 20 52 65 61 64 20 74 68 65 20 66 69  ers. Read the fi
c7a0: 72 73 74 20 6e 4f 75 74 20 6f 66 20 74 68 65 73  rst nOut of thes
c7b0: 65 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 61 72  e into.** the ar
c7c0: 72 61 79 20 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73  ray aOut[]..*/.s
c7d0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
c7e0: 65 49 6e 74 41 72 72 61 79 28 0a 20 20 63 68 61  eIntArray(.  cha
c7f0: 72 20 2a 7a 49 6e 74 41 72 72 61 79 2c 20 20 20  r *zIntArray,   
c800: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f      /* String co
c810: 6e 74 61 69 6e 69 6e 67 20 69 6e 74 20 61 72 72  ntaining int arr
c820: 61 79 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  ay to decode */.
c830: 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
c840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c850: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61  er of slots in a
c860: 4f 75 74 5b 5d 20 2a 2f 0a 20 20 74 52 6f 77 63  Out[] */.  tRowc
c870: 6e 74 20 2a 61 4f 75 74 2c 20 20 20 20 20 20 20  nt *aOut,       
c880: 20 20 2f 2a 20 53 74 6f 72 65 20 69 6e 74 65 67    /* Store integ
c890: 65 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 4c 6f  ers here */.  Lo
c8a0: 67 45 73 74 20 2a 61 4c 6f 67 2c 20 20 20 20 20  gEst *aLog,     
c8b0: 20 20 20 20 20 2f 2a 20 4f 72 2c 20 69 66 20 61       /* Or, if a
c8c0: 4f 75 74 3d 3d 30 2c 20 68 65 72 65 20 2a 2f 0a  Out==0, here */.
c8d0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
c8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
c8f0: 6c 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 66  le extra flags f
c900: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  or this index, i
c910: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
c920: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 49 6e  .  char *z = zIn
c930: 74 41 72 72 61 79 3b 0a 20 20 69 6e 74 20 63 3b  tArray;.  int c;
c940: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77  .  int i;.  tRow
c950: 63 6e 74 20 76 3b 0a 0a 23 69 66 64 65 66 20 53  cnt v;..#ifdef S
c960: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c970: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66  T3_OR_STAT4.  if
c980: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
c990: 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28  .#else.  assert(
c9a0: 20 7a 21 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a   z!=0 );.#endif.
c9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26    for(i=0; *z &&
c9c0: 20 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOut; i++){. 
c9d0: 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68     v = 0;.    wh
c9e0: 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27  ile( (c=z[0])>='
c9f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a  0' && c<='9' ){.
ca00: 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
ca10: 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20   c - '0';.      
ca20: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  z++;.    }.#ifde
ca30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ca40: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
ca50: 20 20 20 69 66 28 20 61 4f 75 74 20 29 20 61 4f     if( aOut ) aO
ca60: 75 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69  ut[i] = v;.    i
ca70: 66 28 20 61 4c 6f 67 20 29 20 61 4c 6f 67 5b 69  f( aLog ) aLog[i
ca80: 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ] = sqlite3LogEs
ca90: 74 28 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  t(v);.#else.    
caa0: 61 73 73 65 72 74 28 20 61 4f 75 74 3d 3d 30 20  assert( aOut==0 
cab0: 29 3b 0a 20 20 20 20 55 4e 55 53 45 44 5f 50 41  );.    UNUSED_PA
cac0: 52 41 4d 45 54 45 52 28 61 4f 75 74 29 3b 0a 20  RAMETER(aOut);. 
cad0: 20 20 20 61 73 73 65 72 74 28 20 61 4c 6f 67 21     assert( aLog!
cae0: 3d 30 20 29 3b 0a 20 20 20 20 61 4c 6f 67 5b 69  =0 );.    aLog[i
caf0: 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ] = sqlite3LogEs
cb00: 74 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  t(v);.#endif.   
cb10: 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a   if( *z==' ' ) z
cb20: 2b 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ++;.  }.#ifndef 
cb30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
cb40: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61  AT3_OR_STAT4.  a
cb50: 73 73 65 72 74 28 20 70 49 6e 64 65 78 21 3d 30  ssert( pIndex!=0
cb60: 20 29 3b 20 7b 0a 23 65 6c 73 65 0a 20 20 69 66   ); {.#else.  if
cb70: 28 20 70 49 6e 64 65 78 20 29 7b 0a 23 65 6e 64  ( pIndex ){.#end
cb80: 69 66 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62  if.    pIndex->b
cb90: 55 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  Unordered = 0;. 
cba0: 20 20 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69     pIndex->noSki
cbb0: 70 53 63 61 6e 20 3d 20 30 3b 0a 20 20 20 20 77  pScan = 0;.    w
cbc0: 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20  hile( z[0] ){.  
cbd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
cbe0: 73 74 72 67 6c 6f 62 28 22 75 6e 6f 72 64 65 72  strglob("unorder
cbf0: 65 64 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  ed*", z)==0 ){. 
cc00: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62         pIndex->b
cc10: 55 6e 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  Unordered = 1;. 
cc20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
cc30: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
cc40: 73 7a 3d 5b 30 2d 39 5d 2a 22 2c 20 7a 29 3d 3d  sz=[0-9]*", z)==
cc50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
cc60: 64 65 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  dex->szIdxRow = 
cc70: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 71  sqlite3LogEst(sq
cc80: 6c 69 74 65 33 41 74 6f 69 28 7a 2b 33 29 29 3b  lite3Atoi(z+3));
cc90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
cca0: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
ccb0: 28 22 6e 6f 73 6b 69 70 73 63 61 6e 2a 22 2c 20  ("noskipscan*", 
ccc0: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
ccd0: 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53   pIndex->noSkipS
cce0: 63 61 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  can = 1;.      }
ccf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cd00: 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20  NABLE_COSTMULT. 
cd10: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 71       else if( sq
cd20: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 63  lite3_strglob("c
cd30: 6f 73 74 6d 75 6c 74 3d 5b 30 2d 39 5d 2a 22 2c  ostmult=[0-9]*",
cd40: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
cd50: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
cd60: 3e 63 6f 73 74 4d 75 6c 74 20 3d 20 73 71 6c 69  >costMult = sqli
cd70: 74 65 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65  te3LogEst(sqlite
cd80: 33 41 74 6f 69 28 7a 2b 39 29 29 3b 0a 20 20 20  3Atoi(z+9));.   
cd90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cda0: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30    while( z[0]!=0
cdb0: 20 26 26 20 7a 5b 30 5d 21 3d 27 20 27 20 29 20   && z[0]!=' ' ) 
cdc0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
cdd0: 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b  ( z[0]==' ' ) z+
cde0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
cdf0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  /*.** This callb
ce00: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ack is invoked o
ce10: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64  nce for each ind
ce20: 65 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ex when reading 
ce30: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74  the.** sqlite_st
ce40: 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a  at1 table.  .**.
ce50: 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d  **     argv[0] =
ce60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
ce70: 6c 65 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31  le.**     argv[1
ce80: 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ] = name of the 
ce90: 69 6e 64 65 78 20 28 6d 69 67 68 74 20 62 65 20  index (might be 
cea0: 4e 55 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67  NULL).**     arg
ceb0: 76 5b 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f  v[2] = results o
cec0: 66 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20  f analysis - on 
ced0: 69 6e 74 65 67 65 72 20 66 6f 72 20 65 61 63 68  integer for each
cee0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e   column.**.** En
cef0: 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20  tries for which 
cf00: 61 72 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69  argv[1]==NULL si
cf10: 6d 70 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20  mply record the 
cf20: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
cf30: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a  n.** the table..
cf40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
cf50: 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69  alysisLoader(voi
cf60: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
cf70: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
cf80: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
cf90: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
cfa0: 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79   *pInfo = (analy
cfb0: 73 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a  sisInfo*)pData;.
cfc0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
cfd0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
cfe0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
cff0: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  z;..  assert( ar
d000: 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45  gc==3 );.  UNUSE
d010: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
d020: 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20  Used, argc);..  
d030: 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61  if( argv==0 || a
d040: 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67  rgv[0]==0 || arg
d050: 76 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  v[2]==0 ){.    r
d060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
d070: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
d080: 69 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e  indTable(pInfo->
d090: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e  db, argv[0], pIn
d0a0: 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  fo->zDatabase);.
d0b0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
d0c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d0d0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b  .  }.  if( argv[
d0e0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  1]==0 ){.    pIn
d0f0: 64 65 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  dex = 0;.  }else
d100: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
d110: 69 63 6d 70 28 61 72 67 76 5b 30 5d 2c 61 72 67  icmp(argv[0],arg
d120: 76 5b 31 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  v[1])==0 ){.    
d130: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
d140: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
d150: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
d160: 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73  {.    pIndex = s
d170: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
d180: 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b  pInfo->db, argv[
d190: 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61  1], pInfo->zData
d1a0: 62 61 73 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d  base);.  }.  z =
d1b0: 20 61 72 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28   argv[2];..  if(
d1c0: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 74   pIndex ){.    t
d1d0: 52 6f 77 63 6e 74 20 2a 61 69 52 6f 77 45 73 74  Rowcnt *aiRowEst
d1e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
d1f0: 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
d200: 79 43 6f 6c 2b 31 3b 0a 23 69 66 64 65 66 20 53  yCol+1;.#ifdef S
d210: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d220: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
d230: 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
d240: 74 20 6d 61 79 20 61 6c 72 65 61 64 79 20 62 65  t may already be
d250: 20 73 65 74 20 68 65 72 65 20 69 66 20 74 68 65   set here if the
d260: 72 65 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  re are duplicate
d270: 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f   .    ** sqlite_
d280: 73 74 61 74 31 20 65 6e 74 72 69 65 73 20 66 6f  stat1 entries fo
d290: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 20 49 6e  r this index. In
d2a0: 20 74 68 61 74 20 63 61 73 65 20 6a 75 73 74 20   that case just 
d2b0: 63 6c 6f 62 62 65 72 0a 20 20 20 20 2a 2a 20 74  clobber.    ** t
d2c0: 68 65 20 6f 6c 64 20 64 61 74 61 20 77 69 74 68  he old data with
d2d0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 65 61 64   the new instead
d2e0: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   of allocating a
d2f0: 20 6e 65 77 20 61 72 72 61 79 2e 20 20 2a 2f 0a   new array.  */.
d300: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
d310: 61 69 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20  aiRowEst==0 ){. 
d320: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 52       pIndex->aiR
d330: 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74  owEst = (tRowcnt
d340: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
d350: 65 72 6f 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  ero(sizeof(tRowc
d360: 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 20  nt) * nCol);.   
d370: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
d380: 69 52 6f 77 45 73 74 3d 3d 30 20 29 20 73 71 6c  iRowEst==0 ) sql
d390: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 49 6e  ite3OomFault(pIn
d3a0: 66 6f 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  fo->db);.    }. 
d3b0: 20 20 20 61 69 52 6f 77 45 73 74 20 3d 20 70 49     aiRowEst = pI
d3c0: 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  ndex->aiRowEst;.
d3d0: 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64 65  #endif.    pInde
d3e0: 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d 20  x->bUnordered = 
d3f0: 30 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  0;.    decodeInt
d400: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
d410: 6e 43 6f 6c 2c 20 61 69 52 6f 77 45 73 74 2c 20  nCol, aiRowEst, 
d420: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67  pIndex->aiRowLog
d430: 45 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  Est, pIndex);.  
d440: 20 20 70 49 6e 64 65 78 2d 3e 68 61 73 53 74 61    pIndex->hasSta
d450: 74 31 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  t1 = 1;.    if( 
d460: 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
d470: 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
d480: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
d490: 67 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e 61  gEst = pIndex->a
d4a0: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
d4b0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62       pTable->tab
d4c0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53  Flags |= TF_HasS
d4d0: 74 61 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  tat1;.    }.  }e
d4e0: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 66  lse{.    Index f
d4f0: 61 6b 65 49 64 78 3b 0a 20 20 20 20 66 61 6b 65  akeIdx;.    fake
d500: 49 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  Idx.szIdxRow = p
d510: 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 3b  Table->szTabRow;
d520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d530: 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20  NABLE_COSTMULT. 
d540: 20 20 20 66 61 6b 65 49 64 78 2e 70 54 61 62 6c     fakeIdx.pTabl
d550: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 23 65 6e 64  e = pTable;.#end
d560: 69 66 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  if.    decodeInt
d570: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
d580: 31 2c 20 30 2c 20 26 70 54 61 62 6c 65 2d 3e 6e  1, 0, &pTable->n
d590: 52 6f 77 4c 6f 67 45 73 74 2c 20 26 66 61 6b 65  RowLogEst, &fake
d5a0: 49 64 78 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Idx);.    pTable
d5b0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 66 61 6b  ->szTabRow = fak
d5c0: 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 3b 0a 20  eIdx.szIdxRow;. 
d5d0: 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c     pTable->tabFl
d5e0: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53 74 61  ags |= TF_HasSta
d5f0: 74 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t1;.  }..  retur
d600: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
d610: 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70   the Index.aSamp
d620: 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  le variable is n
d630: 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20  ot NULL, delete 
d640: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
d650: 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63  ray.** and its c
d660: 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  ontents..*/.void
d670: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
d680: 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74  dexSamples(sqlit
d690: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
d6a0: 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Idx){.#ifdef SQL
d6b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
d6c0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
d6d0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29 7b  pIdx->aSample ){
d6e0: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
d6f0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
d700: 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a  >nSample; j++){.
d710: 20 20 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c        IndexSampl
d720: 65 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61 53  e *p = &pIdx->aS
d730: 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  ample[j];.      
d740: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d750: 2c 20 70 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a 20  , p->p);.    }. 
d760: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d770: 28 64 62 2c 20 70 49 64 78 2d 3e 61 53 61 6d 70  (db, pIdx->aSamp
d780: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  le);.  }.  if( d
d790: 62 20 26 26 20 64 62 2d 3e 70 6e 42 79 74 65 73  b && db->pnBytes
d7a0: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
d7b0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20  pIdx->nSample = 
d7c0: 30 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61  0;.    pIdx->aSa
d7d0: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  mple = 0;.  }.#e
d7e0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
d7f0: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
d800: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d810: 49 64 78 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Idx);.#endif /* 
d820: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
d830: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
d840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d850: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d860: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f 70  _STAT4./*.** Pop
d870: 75 6c 61 74 65 20 74 68 65 20 70 49 64 78 2d 3e  ulate the pIdx->
d880: 61 41 76 67 45 71 5b 5d 20 61 72 72 61 79 20 62  aAvgEq[] array b
d890: 61 73 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 70  ased on the samp
d8a0: 6c 65 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  les currently.**
d8b0: 20 73 74 6f 72 65 64 20 69 6e 20 70 49 64 78 2d   stored in pIdx-
d8c0: 3e 61 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a  >aSample[]. .*/.
d8d0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
d8e0: 41 76 67 45 71 28 49 6e 64 65 78 20 2a 70 49 64  AvgEq(Index *pId
d8f0: 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29  x){.  if( pIdx )
d900: 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c  {.    IndexSampl
d910: 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  e *aSample = pId
d920: 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->aSample;.    
d930: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 46 69  IndexSample *pFi
d940: 6e 61 6c 20 3d 20 26 61 53 61 6d 70 6c 65 5b 70  nal = &aSample[p
d950: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b  Idx->nSample-1];
d960: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  .    int iCol;. 
d970: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b     int nCol = 1;
d980: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  .    if( pIdx->n
d990: 53 61 6d 70 6c 65 43 6f 6c 3e 31 20 29 7b 0a 20  SampleCol>1 ){. 
d9a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
d9b0: 69 73 20 73 74 61 74 34 20 64 61 74 61 2c 20 74  is stat4 data, t
d9c0: 68 65 6e 20 63 61 6c 63 75 6c 61 74 65 20 61 41  hen calculate aA
d9d0: 76 67 45 71 5b 5d 20 76 61 6c 75 65 73 20 66 6f  vgEq[] values fo
d9e0: 72 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 73  r all.      ** s
d9f0: 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 65 78  ample columns ex
da00: 63 65 70 74 20 74 68 65 20 6c 61 73 74 2e 20 54  cept the last. T
da10: 68 65 20 6c 61 73 74 20 69 73 20 61 6c 77 61 79  he last is alway
da20: 73 20 73 65 74 20 74 6f 20 31 2c 20 61 73 0a 20  s set to 1, as. 
da30: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 68 65       ** once the
da40: 20 74 72 61 69 6c 69 6e 67 20 50 4b 20 66 69 65   trailing PK fie
da50: 6c 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  lds are consider
da60: 65 64 20 61 6c 6c 20 69 6e 64 65 78 20 6b 65 79  ed all index key
da70: 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 75  s are.      ** u
da80: 6e 69 71 75 65 2e 20 20 2a 2f 0a 20 20 20 20 20  nique.  */.     
da90: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53   nCol = pIdx->nS
daa0: 61 6d 70 6c 65 43 6f 6c 2d 31 3b 0a 20 20 20 20  ampleCol-1;.    
dab0: 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e    pIdx->aAvgEq[n
dac0: 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Col] = 1;.    }.
dad0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
dae0: 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  iCol<nCol; iCol+
daf0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  +){.      int nS
db00: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53  ample = pIdx->nS
db10: 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ample;.      int
db20: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
db30: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
db40: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
db50: 68 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20  h samples */.   
db60: 20 20 20 74 52 6f 77 63 6e 74 20 73 75 6d 45 71     tRowcnt sumEq
db70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
db80: 53 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20 76  Sum of the nEq v
db90: 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 74  alues */.      t
dba0: 52 6f 77 63 6e 74 20 61 76 67 45 71 20 3d 20 30  Rowcnt avgEq = 0
dbb0: 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
dbc0: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
dbd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
dbe0: 6f 77 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  ows in index */.
dbf0: 20 20 20 20 20 20 69 36 34 20 6e 53 75 6d 31 30        i64 nSum10
dc00: 30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  0 = 0;          
dc10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
dc20: 6d 73 20 63 6f 6e 74 72 69 62 75 74 69 6e 67 20  ms contributing 
dc30: 74 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20 20 20  to sumEq */.    
dc40: 20 20 69 36 34 20 6e 44 69 73 74 31 30 30 3b 20    i64 nDist100; 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dc60: 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
dc70: 74 20 76 61 6c 75 65 73 20 69 6e 20 69 6e 64 65  t values in inde
dc80: 78 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  x */..      if( 
dc90: 21 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20  !pIdx->aiRowEst 
dca0: 7c 7c 20 69 43 6f 6c 3e 3d 70 49 64 78 2d 3e 6e  || iCol>=pIdx->n
dcb0: 4b 65 79 43 6f 6c 20 7c 7c 20 70 49 64 78 2d 3e  KeyCol || pIdx->
dcc0: 61 69 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31 5d  aiRowEst[iCol+1]
dcd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ==0 ){.        n
dce0: 52 6f 77 20 3d 20 70 46 69 6e 61 6c 2d 3e 61 6e  Row = pFinal->an
dcf0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
dd00: 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28 69 36    nDist100 = (i6
dd10: 34 29 31 30 30 20 2a 20 70 46 69 6e 61 6c 2d 3e  4)100 * pFinal->
dd20: 61 6e 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  anDLt[iCol];.   
dd30: 20 20 20 20 20 6e 53 61 6d 70 6c 65 2d 2d 3b 0a       nSample--;.
dd40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd50: 20 20 20 20 20 6e 52 6f 77 20 3d 20 70 49 64 78       nRow = pIdx
dd60: 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
dd70: 20 20 20 20 20 20 20 6e 44 69 73 74 31 30 30 20         nDist100 
dd80: 3d 20 28 28 69 36 34 29 31 30 30 20 2a 20 70 49  = ((i64)100 * pI
dd90: 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29  dx->aiRowEst[0])
dda0: 20 2f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   / pIdx->aiRowEs
ddb0: 74 5b 69 43 6f 6c 2b 31 5d 3b 0a 20 20 20 20 20  t[iCol+1];.     
ddc0: 20 7d 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e   }.      pIdx->n
ddd0: 52 6f 77 45 73 74 30 20 3d 20 6e 52 6f 77 3b 0a  RowEst0 = nRow;.
dde0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 53  .      /* Set nS
ddf0: 75 6d 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  um to the number
de00: 20 6f 66 20 64 69 73 74 69 6e 63 74 20 28 69 43   of distinct (iC
de10: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
de20: 69 78 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ixes that.      
de30: 2a 2a 20 6f 63 63 75 72 20 69 6e 20 74 68 65 20  ** occur in the 
de40: 73 74 61 74 34 20 74 61 62 6c 65 20 66 6f 72 20  stat4 table for 
de50: 74 68 69 73 20 69 6e 64 65 78 2e 20 53 65 74 20  this index. Set 
de60: 73 75 6d 45 71 20 74 6f 20 74 68 65 20 73 75 6d  sumEq to the sum
de70: 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   of .      ** th
de80: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 66 6f 72  e nEq values for
de90: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f 72   column iCol for
dea0: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 28 61   the same set (a
deb0: 64 64 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  dding the value 
dec0: 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  .      ** only o
ded0: 6e 63 65 20 77 68 65 72 65 20 74 68 65 72 65 20  nce where there 
dee0: 65 78 69 73 74 20 64 75 70 6c 69 63 61 74 65 20  exist duplicate 
def0: 70 72 65 66 69 78 65 73 29 2e 20 20 2a 2f 0a 20  prefixes).  */. 
df00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
df10: 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
df20: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 70         if( i==(p
df30: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 29 0a  Idx->nSample-1).
df40: 20 20 20 20 20 20 20 20 20 7c 7c 20 61 53 61 6d           || aSam
df50: 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43 6f  ple[i].anDLt[iCo
df60: 6c 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b 31 5d  l]!=aSample[i+1]
df70: 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 0a 20 20  .anDLt[iCol] .  
df80: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
df90: 20 20 20 73 75 6d 45 71 20 2b 3d 20 61 53 61 6d     sumEq += aSam
dfa0: 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
dfb0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 75  ];.          nSu
dfc0: 6d 31 30 30 20 2b 3d 20 31 30 30 3b 0a 20 20 20  m100 += 100;.   
dfd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
dfe0: 20 20 20 20 20 20 69 66 28 20 6e 44 69 73 74 31        if( nDist1
dff0: 30 30 3e 6e 53 75 6d 31 30 30 20 26 26 20 73 75  00>nSum100 && su
e000: 6d 45 71 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20  mEq<nRow ){.    
e010: 20 20 20 20 61 76 67 45 71 20 3d 20 28 28 69 36      avgEq = ((i6
e020: 34 29 31 30 30 20 2a 20 28 6e 52 6f 77 20 2d 20  4)100 * (nRow - 
e030: 73 75 6d 45 71 29 29 2f 28 6e 44 69 73 74 31 30  sumEq))/(nDist10
e040: 30 20 2d 20 6e 53 75 6d 31 30 30 29 3b 0a 20 20  0 - nSum100);.  
e050: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e060: 61 76 67 45 71 3d 3d 30 20 29 20 61 76 67 45 71  avgEq==0 ) avgEq
e070: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78   = 1;.      pIdx
e080: 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3d  ->aAvgEq[iCol] =
e090: 20 61 76 67 45 71 3b 0a 20 20 20 20 7d 0a 20 20   avgEq;.    }.  
e0a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  }.}../*.** Look 
e0b0: 75 70 20 61 6e 20 69 6e 64 65 78 20 62 79 20 6e  up an index by n
e0c0: 61 6d 65 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  ame.  Or, if the
e0d0: 20 6e 61 6d 65 20 6f 66 20 61 20 57 49 54 48 4f   name of a WITHO
e0e0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 2a  UT ROWID table.*
e0f0: 2a 20 69 73 20 73 75 70 70 6c 69 65 64 20 69 6e  * is supplied in
e100: 73 74 65 61 64 2c 20 66 69 6e 64 20 74 68 65 20  stead, find the 
e110: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
e120: 78 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  x for that table
e130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 64 65  ..*/.static Inde
e140: 78 20 2a 66 69 6e 64 49 6e 64 65 78 4f 72 50 72  x *findIndexOrPr
e150: 69 6d 61 72 79 4b 65 79 28 0a 20 20 73 71 6c 69  imaryKey(.  sqli
e160: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e170: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
e180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 0a  const char *zDb.
e190: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
e1a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
e1b0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
e1c0: 44 62 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  Db);.  if( pIdx=
e1d0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
e1e0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46  *pTab = sqlite3F
e1f0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
e200: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
e210: 28 20 70 54 61 62 20 26 26 20 21 48 61 73 52 6f  ( pTab && !HasRo
e220: 77 69 64 28 70 54 61 62 29 20 29 20 70 49 64 78  wid(pTab) ) pIdx
e230: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e240: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
e260: 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  dx;.}../*.** Loa
e270: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 72  d the content fr
e280: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 73 71  om either the sq
e290: 6c 69 74 65 5f 73 74 61 74 34 20 6f 72 20 73 71  lite_stat4 or sq
e2a0: 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65  lite_stat3 table
e2b0: 20 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65   .** into the re
e2c0: 6c 65 76 61 6e 74 20 49 6e 64 65 78 2e 61 53 61  levant Index.aSa
e2d0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a  mple[] arrays..*
e2e0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 7a  *.** Arguments z
e2f0: 53 71 6c 31 20 61 6e 64 20 7a 53 71 6c 32 20 6d  Sql1 and zSql2 m
e300: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 53 51 4c  ust point to SQL
e310: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
e320: 20 72 65 74 75 72 6e 0a 2a 2a 20 64 61 74 61 20   return.** data 
e330: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
e340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 73 74 61  e following (sta
e350: 74 65 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66  tements are diff
e360: 65 72 65 6e 74 20 66 6f 72 20 73 74 61 74 33 2c  erent for stat3,
e370: 0a 2a 2a 20 73 65 65 20 74 68 65 20 63 61 6c 6c  .** see the call
e380: 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
e390: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 29  ion for details)
e3a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 7a 53 71 6c 31  :.**.**    zSql1
e3b0: 3a 20 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75  : SELECT idx,cou
e3c0: 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71  nt(*) FROM %Q.sq
e3d0: 6c 69 74 65 5f 73 74 61 74 34 20 47 52 4f 55 50  lite_stat4 GROUP
e3e0: 20 42 59 20 69 64 78 0a 2a 2a 20 20 20 20 7a 53   BY idx.**    zS
e3f0: 71 6c 32 3a 20 53 45 4c 45 43 54 20 69 64 78 2c  ql2: SELECT idx,
e400: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d  neq,nlt,ndlt,sam
e410: 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ple FROM %Q.sqli
e420: 74 65 5f 73 74 61 74 34 0a 2a 2a 0a 2a 2a 20 77  te_stat4.**.** w
e430: 68 65 72 65 20 25 51 20 69 73 20 72 65 70 6c 61  here %Q is repla
e440: 63 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ced with the dat
e450: 61 62 61 73 65 20 6e 61 6d 65 20 62 65 66 6f 72  abase name befor
e460: 65 20 74 68 65 20 53 51 4c 20 69 73 20 65 78 65  e the SQL is exe
e470: 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cuted..*/.static
e480: 20 69 6e 74 20 6c 6f 61 64 53 74 61 74 54 62 6c   int loadStatTbl
e490: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
e4c0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndle */.  int bS
e4d0: 74 61 74 33 2c 20 20 20 20 20 20 20 20 20 20 20  tat3,           
e4e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
e4f0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
e500: 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 2a 2f 0a  records only */.
e510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
e520: 71 6c 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ql1,            
e530: 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
e540: 20 31 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a   1 (see above) *
e550: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e560: 7a 53 71 6c 32 2c 20 20 20 20 20 20 20 20 20 20  zSql2,          
e570: 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
e580: 6e 74 20 32 20 28 73 65 65 20 61 62 6f 76 65 29  nt 2 (see above)
e590: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e5a0: 20 2a 7a 44 62 20 20 20 20 20 20 20 20 20 20 20   *zDb           
e5b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e5c0: 6e 61 6d 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e  name (e.g. "main
e5d0: 22 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ") */.){.  int r
e5e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
e5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e600: 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75  lt codes from su
e610: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73  broutines */.  s
e620: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e630: 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  mt = 0;      /* 
e640: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
e650: 20 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a 20 20   being run */.  
e660: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e680: 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   Text of the SQL
e690: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e6a0: 49 6e 64 65 78 20 2a 70 50 72 65 76 49 64 78 20  Index *pPrevIdx 
e6b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
e6c0: 20 50 72 65 76 69 6f 75 73 20 69 6e 64 65 78 20   Previous index 
e6d0: 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  in the loop */. 
e6e0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 53   IndexSample *pS
e6f0: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  ample;         /
e700: 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70 49 64 78  * A slot in pIdx
e710: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a  ->aSample[] */..
e720: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
e730: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
e740: 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   );.  zSql = sql
e750: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e760: 7a 53 71 6c 31 2c 20 7a 44 62 29 3b 0a 20 20 69  zSql1, zDb);.  i
e770: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
e780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e790: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
e7a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
e7b0: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  pare(db, zSql, -
e7c0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
e7d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e7e0: 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  b, zSql);.  if( 
e7f0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
e800: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
e810: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
e820: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
e830: 20 69 6e 74 20 6e 49 64 78 43 6f 6c 20 3d 20 31   int nIdxCol = 1
e840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e850: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
e860: 6d 6e 73 20 69 6e 20 73 74 61 74 34 20 72 65 63  mns in stat4 rec
e870: 6f 72 64 73 20 2a 2f 0a 0a 20 20 20 20 63 68 61  ords */..    cha
e880: 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20  r *zIndex;   /* 
e890: 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  Index name */.  
e8a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
e8b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e8c0: 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  the index object
e8d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d   */.    int nSam
e8e0: 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ple;    /* Numbe
e8f0: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a  r of samples */.
e900: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
e910: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e920: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a  space required *
e930: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
e940: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
e950: 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  f space required
e960: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
e970: 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49  *pSpace;..    zI
e980: 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73  ndex = (char *)s
e990: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
e9a0: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
e9b0: 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20    if( zIndex==0 
e9c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e9d0: 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65  nSample = sqlite
e9e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
e9f0: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70 49 64 78  mt, 1);.    pIdx
ea00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72   = findIndexOrPr
ea10: 69 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e  imaryKey(db, zIn
ea20: 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 61  dex, zDb);.    a
ea30: 73 73 65 72 74 28 20 70 49 64 78 3d 3d 30 20 7c  ssert( pIdx==0 |
ea40: 7c 20 62 53 74 61 74 33 20 7c 7c 20 70 49 64 78  | bStat3 || pIdx
ea50: 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a  ->nSample==0 );.
ea60: 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 6e 53 61      /* Index.nSa
ea70: 6d 70 6c 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mple is non-zero
ea80: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
ea90: 66 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61  f data has alrea
eaa0: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 6c  dy been.    ** l
eab0: 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 73  oaded from the s
eac0: 74 61 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74  tat4 table. In t
ead0: 68 69 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20  his case ignore 
eae0: 73 74 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a  stat3 data.  */.
eaf0: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
eb00: 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  || pIdx->nSample
eb10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
eb20: 20 69 66 28 20 62 53 74 61 74 33 3d 3d 30 20 29   if( bStat3==0 )
eb30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
eb40: 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e  !HasRowid(pIdx->
eb50: 70 54 61 62 6c 65 29 20 7c 7c 20 70 49 64 78 2d  pTable) || pIdx-
eb60: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >nColumn==pIdx->
eb70: 6e 4b 65 79 43 6f 6c 2b 31 20 29 3b 0a 20 20 20  nKeyCol+1 );.   
eb80: 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
eb90: 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 26  (pIdx->pTable) &
eba0: 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  & IsPrimaryKeyIn
ebb0: 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20  dex(pIdx) ){.   
ebc0: 20 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70       nIdxCol = p
ebd0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
ebe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ebf0: 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64     nIdxCol = pId
ec00: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
ec10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
ec20: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 3d  dx->nSampleCol =
ec30: 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 6e 42   nIdxCol;.    nB
ec40: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64  yte = sizeof(Ind
ec50: 65 78 53 61 6d 70 6c 65 29 20 2a 20 6e 53 61 6d  exSample) * nSam
ec60: 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b  ple;.    nByte +
ec70: 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  = sizeof(tRowcnt
ec80: 29 20 2a 20 6e 49 64 78 43 6f 6c 20 2a 20 33 20  ) * nIdxCol * 3 
ec90: 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e  * nSample;.    n
eca0: 42 79 74 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 20  Byte += nIdxCol 
ecb0: 2a 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  * sizeof(tRowcnt
ecc0: 29 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20  );     /* Space 
ecd0: 66 6f 72 20 49 6e 64 65 78 2e 61 41 76 67 45 71  for Index.aAvgEq
ece0: 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 2d  [] */..    pIdx-
ecf0: 3e 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74  >aSample = sqlit
ed00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ed10: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
ed20: 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  f( pIdx->aSample
ed30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ed40: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
ed50: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
ed60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
ed70: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
ed80: 70 53 70 61 63 65 20 3d 20 28 74 52 6f 77 63 6e  pSpace = (tRowcn
ed90: 74 2a 29 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c  t*)&pIdx->aSampl
eda0: 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20  e[nSample];.    
edb0: 70 49 64 78 2d 3e 61 41 76 67 45 71 20 3d 20 70  pIdx->aAvgEq = p
edc0: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
edd0: 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 66 6f   nIdxCol;.    fo
ede0: 72 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65  r(i=0; i<nSample
edf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
ee00: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  dx->aSample[i].a
ee10: 6e 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53  nEq = pSpace; pS
ee20: 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b  pace += nIdxCol;
ee30: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61  .      pIdx->aSa
ee40: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70  mple[i].anLt = p
ee50: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
ee60: 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20   nIdxCol;.      
ee70: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  pIdx->aSample[i]
ee80: 2e 61 6e 44 4c 74 20 3d 20 70 53 70 61 63 65 3b  .anDLt = pSpace;
ee90: 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43   pSpace += nIdxC
eea0: 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ol;.    }.    as
eeb0: 73 65 72 74 28 20 28 28 75 38 2a 29 70 53 70 61  sert( ((u8*)pSpa
eec0: 63 65 29 2d 6e 42 79 74 65 3d 3d 28 75 38 2a 29  ce)-nByte==(u8*)
eed0: 28 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 20  (pIdx->aSample) 
eee0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
eef0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
ef00: 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Stmt);.  if( rc 
ef10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ef20: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
ef30: 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 32 2c  rintf(db, zSql2,
ef40: 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53   zDb);.  if( !zS
ef50: 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ql ){.    return
ef60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
ef70: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  PT;.  }.  rc = s
ef80: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
ef90: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
efa0: 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
efb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
efc0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  l);.  if( rc ) r
efd0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69  eturn rc;..  whi
efe0: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
eff0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
f000: 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ROW ){.    char 
f010: 2a 7a 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *zIndex;        
f020: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f030: 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e  x name */.    In
f040: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
f050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f060: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e  ointer to the in
f070: 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
f080: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20    int nCol = 1; 
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
f0b0: 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f  umns in index */
f0c0: 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28  ..    zIndex = (
f0d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
f0e0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
f0f0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49  , 0);.    if( zI
f100: 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ndex==0 ) contin
f110: 75 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66  ue;.    pIdx = f
f120: 69 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72  indIndexOrPrimar
f130: 79 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c  yKey(db, zIndex,
f140: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
f150: 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Idx==0 ) continu
f160: 65 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6e  e;.    /* This n
f170: 65 78 74 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ext condition is
f180: 20 74 72 75 65 20 69 66 20 64 61 74 61 20 68 61   true if data ha
f190: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
f1a0: 6f 61 64 65 64 20 66 72 6f 6d 20 0a 20 20 20 20  oaded from .    
f1b0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  ** the sqlite_st
f1c0: 61 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68  at4 table. In th
f1d0: 69 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73  is case ignore s
f1e0: 74 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20  tat3 data.  */. 
f1f0: 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e     nCol = pIdx->
f200: 6e 53 61 6d 70 6c 65 43 6f 6c 3b 0a 20 20 20 20  nSampleCol;.    
f210: 69 66 28 20 62 53 74 61 74 33 20 26 26 20 6e 43  if( bStat3 && nC
f220: 6f 6c 3e 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ol>1 ) continue;
f230: 0a 20 20 20 20 69 66 28 20 70 49 64 78 21 3d 70  .    if( pIdx!=p
f240: 50 72 65 76 49 64 78 20 29 7b 0a 20 20 20 20 20  PrevIdx ){.     
f250: 20 69 6e 69 74 41 76 67 45 71 28 70 50 72 65 76   initAvgEq(pPrev
f260: 49 64 78 29 3b 0a 20 20 20 20 20 20 70 50 72 65  Idx);.      pPre
f270: 76 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  vIdx = pIdx;.   
f280: 20 7d 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d   }.    pSample =
f290: 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b   &pIdx->aSample[
f2a0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a  pIdx->nSample];.
f2b0: 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72      decodeIntArr
f2c0: 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  ay((char*)sqlite
f2d0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f2e0: 74 6d 74 2c 31 29 2c 6e 43 6f 6c 2c 70 53 61 6d  tmt,1),nCol,pSam
f2f0: 70 6c 65 2d 3e 61 6e 45 71 2c 30 2c 30 29 3b 0a  ple->anEq,0,0);.
f300: 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72      decodeIntArr
f310: 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  ay((char*)sqlite
f320: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f330: 74 6d 74 2c 32 29 2c 6e 43 6f 6c 2c 70 53 61 6d  tmt,2),nCol,pSam
f340: 70 6c 65 2d 3e 61 6e 4c 74 2c 30 2c 30 29 3b 0a  ple->anLt,0,0);.
f350: 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72      decodeIntArr
f360: 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  ay((char*)sqlite
f370: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f380: 74 6d 74 2c 33 29 2c 6e 43 6f 6c 2c 70 53 61 6d  tmt,3),nCol,pSam
f390: 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30 2c 30 29 3b  ple->anDLt,0,0);
f3a0: 0a 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 20  ..    /* Take a 
f3b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 61 6d 70  copy of the samp
f3c0: 6c 65 2e 20 41 64 64 20 74 77 6f 20 30 78 30 30  le. Add two 0x00
f3d0: 20 62 79 74 65 73 20 74 68 65 20 65 6e 64 20 6f   bytes the end o
f3e0: 66 20 74 68 65 20 62 75 66 66 65 72 2e 0a 20 20  f the buffer..  
f3f0: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6e 20    ** This is in 
f400: 63 61 73 65 20 74 68 65 20 73 61 6d 70 6c 65 20  case the sample 
f410: 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
f420: 74 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ted. In that cas
f430: 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  e, the.    ** sq
f440: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
f450: 6f 6d 70 61 72 65 28 29 20 6d 61 79 20 72 65 61  ompare() may rea
f460: 64 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  d up to two vari
f470: 6e 74 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  nts past the.   
f480: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 61   ** end of the a
f490: 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
f4a0: 62 65 66 6f 72 65 20 69 74 20 72 65 61 6c 69 7a  before it realiz
f4b0: 65 73 20 69 74 20 69 73 20 64 65 61 6c 69 6e 67  es it is dealing
f4c0: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 63   with.    ** a c
f4d0: 6f 72 72 75 70 74 20 72 65 63 6f 72 64 2e 20 41  orrupt record. A
f4e0: 64 64 69 6e 67 20 74 68 65 20 74 77 6f 20 30 78  dding the two 0x
f4f0: 30 30 20 62 79 74 65 73 20 70 72 65 76 65 6e 74  00 bytes prevent
f500: 73 20 74 68 69 73 20 66 72 6f 6d 20 63 61 75 73  s this from caus
f510: 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  ing.    ** a buf
f520: 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 2a  fer overread.  *
f530: 2f 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e  /.    pSample->n
f540: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f550: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34  n_bytes(pStmt, 4
f560: 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  );.    pSample->
f570: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
f580: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 70 53 61 6d  locZero(db, pSam
f590: 70 6c 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 20  ple->n + 2);.   
f5a0: 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70 3d   if( pSample->p=
f5b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f5c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
f5d0: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
f5e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
f5f0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
f600: 66 28 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 29 7b  f( pSample->n ){
f610: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53  .      memcpy(pS
f620: 61 6d 70 6c 65 2d 3e 70 2c 20 73 71 6c 69 74 65  ample->p, sqlite
f630: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
f640: 74 6d 74 2c 20 34 29 2c 20 70 53 61 6d 70 6c 65  tmt, 4), pSample
f650: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
f660: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b  pIdx->nSample++;
f670: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
f680: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
f690: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  mt);.  if( rc==S
f6a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 69 6e 69 74 41  QLITE_OK ) initA
f6b0: 76 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a  vgEq(pPrevIdx);.
f6c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f6d0: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65  /*.** Load conte
f6e0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  nt from the sqli
f6f0: 74 65 5f 73 74 61 74 34 20 61 6e 64 20 73 71 6c  te_stat4 and sql
f700: 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73  ite_stat3 tables
f710: 20 69 6e 74 6f 20 0a 2a 2a 20 74 68 65 20 49 6e   into .** the In
f720: 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72  dex.aSample[] ar
f730: 72 61 79 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69  rays of all indi
f740: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
f750: 6e 74 20 6c 6f 61 64 53 74 61 74 34 28 73 71 6c  nt loadStat4(sql
f760: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
f770: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e  char *zDb){.  in
f780: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f7a0: 20 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72   Result codes fr
f7b0: 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
f7c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  /..  assert( db-
f7d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
f7e0: 62 6c 65 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ble );.  if( sql
f7f0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
f800: 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  , "sqlite_stat4"
f810: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63  , zDb) ){.    rc
f820: 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64   = loadStatTbl(d
f830: 62 2c 20 30 2c 0a 20 20 20 20 20 20 22 53 45 4c  b, 0,.      "SEL
f840: 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29  ECT idx,count(*)
f850: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
f860: 73 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69  stat4 GROUP BY i
f870: 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  dx", .      "SEL
f880: 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c  ECT idx,neq,nlt,
f890: 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d  ndlt,sample FROM
f8a0: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
f8b0: 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20 20  ",.      zDb.   
f8c0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   );.  }..  if( r
f8d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f8e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
f8f0: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
f900: 74 33 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  t3", zDb) ){.   
f910: 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 54 62   rc = loadStatTb
f920: 6c 28 64 62 2c 20 31 2c 0a 20 20 20 20 20 20 22  l(db, 1,.      "
f930: 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74  SELECT idx,count
f940: 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  (*) FROM %Q.sqli
f950: 74 65 5f 73 74 61 74 33 20 47 52 4f 55 50 20 42  te_stat3 GROUP B
f960: 59 20 69 64 78 22 2c 20 0a 20 20 20 20 20 20 22  Y idx", .      "
f970: 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e  SELECT idx,neq,n
f980: 6c 74 2c 6e 64 6c 74 2c 73 71 6c 69 74 65 5f 72  lt,ndlt,sqlite_r
f990: 65 63 6f 72 64 28 73 61 6d 70 6c 65 29 20 46 52  ecord(sample) FR
f9a0: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
f9b0: 74 33 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20  t3",.      zDb. 
f9c0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74     );.  }..  ret
f9d0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f9e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f9f0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
fa00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20   */../*.** Load 
fa10: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
fa20: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
fa30: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
fa40: 2f 34 20 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a  /4 tables. The.*
fa50: 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71  * contents of sq
fa60: 6c 69 74 65 5f 73 74 61 74 31 20 61 72 65 20 75  lite_stat1 are u
fa70: 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  sed to populate 
fa80: 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
fa90: 73 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20  st[].** arrays. 
faa0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
fab0: 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 61  sqlite_stat3/4 a
fac0: 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c  re used to popul
fad0: 61 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78  ate the.** Index
fae0: 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79  .aSample[] array
faf0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
fb00: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
fb10: 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  le is not presen
fb20: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
fb30: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a  e, SQLITE_ERROR.
fb40: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
fb50: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 76  In this case, ev
fb60: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  en if SQLITE_ENA
fb70: 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20  BLE_STAT3/4 was 
fb80: 64 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69  defined .** duri
fb90: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61  ng compilation a
fba0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  nd the sqlite_st
fbb0: 61 74 33 2f 34 20 74 61 62 6c 65 20 69 73 20 70  at3/4 table is p
fbc0: 72 65 73 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20  resent, no data 
fbd0: 69 73 20 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  is .** read from
fbe0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   it..**.** If SQ
fbf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
fc00: 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65 64 20  3/4 was defined 
fc10: 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69  during compilati
fc20: 6f 6e 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 73  on and the .** s
fc30: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
fc40: 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  e is not present
fc50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
fc60: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  , SQLITE_ERROR i
fc70: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 48  s.** returned. H
fc80: 6f 77 65 76 65 72 2c 20 69 6e 20 74 68 69 73 20  owever, in this 
fc90: 63 61 73 65 2c 20 64 61 74 61 20 69 73 20 72 65  case, data is re
fca0: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ad from the sqli
fcb0: 74 65 5f 73 74 61 74 31 0a 2a 2a 20 74 61 62 6c  te_stat1.** tabl
fcc0: 65 20 28 69 66 20 69 74 20 69 73 20 70 72 65 73  e (if it is pres
fcd0: 65 6e 74 29 20 62 65 66 6f 72 65 20 72 65 74 75  ent) before retu
fce0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
fcf0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
fd00: 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  urs, this functi
fd10: 6f 6e 20 61 6c 77 61 79 73 20 73 65 74 73 20 64  on always sets d
fd20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
fd30: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 69  .** This means i
fd40: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65  f the caller doe
fd50: 73 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  s not care about
fd60: 20 6f 74 68 65 72 20 65 72 72 6f 72 73 2c 20 74   other errors, t
fd70: 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 63 6f 64  he return.** cod
fd80: 65 20 6d 61 79 20 62 65 20 69 67 6e 6f 72 65 64  e may be ignored
fd90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fda0: 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c  AnalysisLoad(sql
fdb0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
fdc0: 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e  b){.  analysisIn
fdd0: 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68  fo sInfo;.  Hash
fde0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20  Elem *i;.  char 
fdf0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20  *zSql;.  int rc 
fe00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
fe10: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
fe20: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
fe30: 63 68 65 6d 61 3b 0a 0a 20 20 61 73 73 65 72 74  chema;..  assert
fe40: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
fe50: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
fe60: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
fe70: 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  ].pBt!=0 );..  /
fe80: 2a 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f  * Clear any prio
fe90: 72 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  r statistics */.
fea0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
feb0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
fec0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
fed0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
fee0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
fef0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ->tblHash); i; i
ff00: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
ff10: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
ff20: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
ff30: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 70 54  hData(i);.    pT
ff40: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 3d 20  ab->tabFlags &= 
ff50: 7e 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20  ~TF_HasStat1;.  
ff60: 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
ff70: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
ff80: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b  ma->idxHash); i;
ff90: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
ffa0: 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  t(i)){.    Index
ffb0: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
ffc0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
ffd0: 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 3d  pIdx->hasStat1 =
ffe0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
fff0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
10000 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
10010 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
10020 6d 70 6c 65 73 28 64 62 2c 20 70 49 64 78 29 3b  mples(db, pIdx);
10030 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70  .    pIdx->aSamp
10040 6c 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  le = 0;.#endif. 
10050 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65   }..  /* Load ne
10060 77 20 73 74 61 74 69 73 74 69 63 73 20 6f 75 74  w statistics out
10070 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
10080 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
10090 73 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20  sInfo.db = db;. 
100a0 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
100b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
100c0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 69 66 28 20  zDbSName;.  if( 
100d0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
100e0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
100f0 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61  t1", sInfo.zData
10100 62 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  base)!=0 ){.    
10110 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
10120 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
10130 20 20 20 22 53 45 4c 45 43 54 20 74 62 6c 2c 69     "SELECT tbl,i
10140 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 25 51 2e  dx,stat FROM %Q.
10150 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73  sqlite_stat1", s
10160 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b  Info.zDatabase);
10170 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
10180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10190 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
101a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
101b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
101c0 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61  exec(db, zSql, a
101d0 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26  nalysisLoader, &
101e0 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 20  sInfo, 0);.     
101f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10200 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  b, zSql);.    }.
10210 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 61 70    }..  /* Set ap
10220 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
10230 74 73 20 6f 6e 20 61 6c 6c 20 69 6e 64 65 78 65  ts on all indexe
10240 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 71 6c  s not in the sql
10250 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
10260 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
10270 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
10280 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
10290 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
102a0 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
102b0 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69  ema->idxHash); i
102c0 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
102d0 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65  xt(i)){.    Inde
102e0 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
102f0 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
10300 20 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53   if( !pIdx->hasS
10310 74 61 74 31 20 29 20 73 71 6c 69 74 65 33 44 65  tat1 ) sqlite3De
10320 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78  faultRowEst(pIdx
10330 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61  );.  }..  /* Loa
10340 64 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73  d the statistics
10350 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
10360 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f  _stat4 table. */
10370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10380 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
10390 54 41 54 34 0a 20 20 69 66 28 20 72 63 3d 3d 53  TAT4.  if( rc==S
103a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4f 70 74 69  QLITE_OK && Opti
103b0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
103c0 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33  db, SQLITE_Stat3
103d0 34 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  4) ){.    db->lo
103e0 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
103f0 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61  ++;.    rc = loa
10400 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66 6f  dStat4(db, sInfo
10410 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
10420 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
10430 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 0a 20  Disable--;.  }. 
10440 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
10450 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
10460 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d  >idxHash); i; i=
10470 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
10480 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
10490 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
104a0 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71 6c  Data(i);.    sql
104b0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 2d 3e  ite3_free(pIdx->
104c0 61 69 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 70  aiRowEst);.    p
104d0 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  Idx->aiRowEst = 
104e0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
104f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10500 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
10510 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
10520 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10530 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
10540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
10550 4c 59 5a 45 20 2a 2f 0a                          LYZE */.