/ Hex Artifact Content
Login

Artifact 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
26e0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
26f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
2700: 2e 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a  .%s(%s)", pDb->z
2710: 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61  DbSName, zTab, a
2720: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20  Table[i].zCols. 
2730: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2740: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
2750: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
2760: 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c        aCreateTbl
2770: 5b 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49  [i] = OPFLAG_P2I
2780: 53 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SREG;.      }.  
2790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
27b0: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
27c0: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
27d0: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
27e0: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
27f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2800: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2810: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
2820: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
2830: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
2840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2850: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
2860: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
2870: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43  ->tnum;.      aC
2880: 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b  reateTbl[i] = 0;
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
28a0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
28b0: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
28c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
28d0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
28f0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2900: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
2920: 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
2930: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
2940: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65  Name, zTab, zWhe
2950: 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20  reType, zWhere. 
2960: 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
2980: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
2990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62      }else if( db
29a0: 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
29b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
29c0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
29d0: 73 65 28 70 50 61 72 73 65 2c 20 22 44 45 4c 45  se(pParse, "DELE
29e0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 22 2c 20  TE FROM %Q.%s", 
29f0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2a00: 54 61 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Tab);.#endif.   
2a10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a20: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f    /* The sqlite_
2a30: 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 20  stat[134] table 
2a40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
2a50: 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73   Delete all rows
2a60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a80: 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f  , OP_Clear, aRoo
2a90: 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20  t[i], iDb);.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c   /* Open the sql
2ac0: 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61  ite_stat[134] ta
2ad0: 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69 6e 67  bles for writing
2ae0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
2af0: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b  aTable[i].zCols;
2b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2b10: 74 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  t( i<ArraySize(a
2b20: 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 73 71  Table) );.    sq
2b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2b40: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
2b50: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
2b60: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33  aRoot[i], iDb, 3
2b70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b80: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 43  beChangeP5(v, aC
2b90: 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20  reateTbl[i]);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d  , aTable[i].zNam
2bc0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e));.  }.}../*.*
2bd0: 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75  * Recommended nu
2be0: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
2bf0: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 34  for sqlite_stat4
2c00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2c10: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
2c20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
2c30: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 32  _STAT4_SAMPLES 2
2c40: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
2c50: 54 68 72 65 65 20 53 51 4c 20 66 75 6e 63 74 69  Three SQL functi
2c60: 6f 6e 73 20 2d 20 73 74 61 74 5f 69 6e 69 74 28  ons - stat_init(
2c70: 29 2c 20 73 74 61 74 5f 70 75 73 68 28 29 2c 20  ), stat_push(), 
2c80: 61 6e 64 20 73 74 61 74 5f 67 65 74 28 29 20 2d  and stat_get() -
2c90: 0a 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73  .** share an ins
2ca0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2cb0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2cc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73   to hold their s
2cd0: 74 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  tate.** informat
2ce0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2cf0: 73 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75  struct Stat4Accu
2d00: 6d 20 53 74 61 74 34 41 63 63 75 6d 3b 0a 74 79  m Stat4Accum;.ty
2d10: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2d20: 74 34 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61  t4Sample Stat4Sa
2d30: 6d 70 6c 65 3b 0a 73 74 72 75 63 74 20 53 74 61  mple;.struct Sta
2d40: 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f  t4Sample {.  tRo
2d50: 77 63 6e 74 20 2a 61 6e 45 71 3b 20 20 20 20 20  wcnt *anEq;     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d70: 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71  sqlite_stat4.nEq
2d80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
2d90: 6e 44 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20  nDLt;           
2da0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f        /* sqlite_
2db0: 73 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69  stat4.nDLt */.#i
2dc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2dd0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
2de0: 34 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c  4.  tRowcnt *anL
2df0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e00: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
2e10: 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69  at4.nLt */.  uni
2e20: 6f 6e 20 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  on {.    i64 iRo
2e30: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e50: 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20  d in main table 
2e60: 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  of the key */.  
2e70: 20 20 75 38 20 2a 61 52 6f 77 69 64 3b 20 20 20    u8 *aRowid;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20 57 49 54    /* Key for WIT
2ea0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2eb0: 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33  s */.  } u;.  u3
2ec0: 32 20 6e 52 6f 77 69 64 3b 20 20 20 20 20 20 20  2 nRowid;       
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 53 69 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d   Sizeof aRowid[]
2ef0: 20 2a 2f 0a 20 20 75 38 20 69 73 50 53 61 6d 70   */.  u8 isPSamp
2f00: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2f10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f20: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2f30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  le */.  int iCol
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21 69          /* If !i
2f60: 73 50 53 61 6d 70 6c 65 2c 20 74 68 65 20 72 65  sPSample, the re
2f70: 61 73 6f 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69  ason for inclusi
2f80: 6f 6e 20 2a 2f 0a 20 20 75 33 32 20 69 48 61 73  on */.  u32 iHas
2f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72          /* Tiebr
2fb0: 65 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 23 65  eaker hash */.#e
2fc0: 6e 64 69 66 0a 7d 3b 20 20 20 20 20 20 20 20 20  ndif.};         
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 0a 73 74 72 75             .stru
3000: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a  ct Stat4Accum {.
3010: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3030: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
3040: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
3050: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
3060: 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  PSample;        
3070: 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f   /* How often to
3080: 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73   do a periodic s
3090: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ample */.  int n
30a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
30b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
30d0: 65 78 20 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f  ex + pk/rowid */
30e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
3110: 63 6f 6c 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20  columns w/o the 
3120: 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  pk/rowid */.  in
3130: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3150: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  um number of sam
3160: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
3170: 74 65 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d  te */.  Stat4Sam
3180: 70 6c 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20  ple current;    
3190: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
31a0: 20 61 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c   as a Stat4Sampl
31b0: 65 20 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b  e */.  u32 iPrn;
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f   /* Pseudo-rando
31e0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
31f0: 72 20 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20  r sampling */.  
3200: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65  Stat4Sample *aBe
3210: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  st;       /* Arr
3220: 61 79 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20  ay of nCol best 
3230: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  samples */.  int
3240: 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   iMin;          
3250: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3260: 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20  in a[] of entry 
3270: 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f  with minimum sco
3280: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d  re */.  int nSam
3290: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
32a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
32b0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
32c0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65  /.  int nMaxEqZe
32d0: 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ro;           /*
32e0: 20 4d 61 78 20 6c 65 61 64 69 6e 67 20 30 20 69   Max leading 0 i
32f0: 6e 20 61 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79  n anEq[] for any
3300: 20 61 5b 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20   a[] entry */.  
3310: 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20 20 20  int iGet;       
3320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3330: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 73 61  ex of current sa
3340: 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20 62 79  mple accessed by
3350: 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20   stat_get() */. 
3360: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b   Stat4Sample *a;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3380: 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20  ray of mxSample 
3390: 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65  Stat4Sample obje
33a0: 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  cts */.  sqlite3
33b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
33d0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d  onnection, for m
33e0: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  alloc() */.};../
33f0: 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  * Reclaim memory
3400: 20 75 73 65 64 20 62 79 20 61 20 53 74 61 74 34   used by a Stat4
3410: 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66  Sample.*/.#ifdef
3420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3430: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3440: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3450: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
3460: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3470: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  p){.  assert( db
3480: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3490: 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71  nRowid ){.    sq
34a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
34b0: 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20  p->u.aRowid);.  
34c0: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b    p->nRowid = 0;
34d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
34e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
34f0: 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66 20 61   BLOB value of a
3500: 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66   ROWID.*/.#ifdef
3510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3520: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3530: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3540: 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33  SetRowid(sqlite3
3550: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3560: 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  e *p, int n, con
3570: 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b 0a 20  st u8 *pData){. 
3580: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69  ;.  if( p->nRowi
35a0: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
35b0: 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69  e(db, p->u.aRowi
35c0: 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69  d);.  p->u.aRowi
35d0: 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  d = sqlite3DbMal
35e0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b  locRawNN(db, n);
35f0: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3600: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
3610: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
3620: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
3630: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
3640: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
3650: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
3660: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3670: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3680: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3690: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
36a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
36b0: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
36c0: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
36d0: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
36e0: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
36f0: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3700: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
3710: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3720: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
3730: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
3740: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
3750: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
3760: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3780: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3790: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
37a0: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
37b0: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
37c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
37e0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
37f0: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3800: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
3810: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
3820: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
3830: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
3840: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
3850: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
3860: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3870: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3880: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3890: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
38a0: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
38b0: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
38c0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
38d0: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
38e0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
38f0: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3900: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
3910: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
3920: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3930: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
3940: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
3950: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
3960: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3970: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3980: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
39a0: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
39b0: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
39c0: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
39d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
39e0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
39f0: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3a00: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
3a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3a20: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
3a30: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
3a40: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
3a50: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
3a60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3a70: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3a80: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3aa0: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3ab0: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3ac0: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3ad0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3ae0: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3af0: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3b00: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
3b10: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
3b20: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3b40: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
3b50: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3b60: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3b70: 74 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e  t(N,K,C) SQL fun
3b80: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
3b90: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3ba0: 72 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20  re:.**     N:   
3bb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3bc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3bd0: 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  dex including th
3be0: 65 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65  e rowid/pk (note
3bf0: 20 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20   1).**     K:   
3c00: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3c10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3c20: 64 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68  dex excluding th
3c30: 65 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20  e rowid/pk..**  
3c40: 20 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d     C:    The num
3c50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
3c60: 68 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32  he index (note 2
3c70: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20  ).**.** Note 1: 
3c80: 20 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20   In the special 
3c90: 63 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65  case of the cove
3ca0: 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ring index that 
3cb0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20  implements a.** 
3cc0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3cd0: 62 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75  ble, N is the nu
3ce0: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
3cf0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74  KEY columns, not
3d00: 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
3d10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3d20: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
3d30: 0a 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69  .** Note 2:  C i
3d40: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
3d50: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 2e  STAT3 and STAT4.
3d60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
3d70: 65 73 20 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72  es on ordinary r
3d80: 6f 77 69 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d  owid tables, N==
3d90: 4b 2b 31 2e 20 20 42 75 74 20 66 6f 72 20 69 6e  K+1.  But for in
3da0: 64 65 78 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48  dexes on.** WITH
3db0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
3dc0: 2c 20 4e 3d 4b 2b 50 20 77 68 65 72 65 20 50 20  , N=K+P where P 
3dd0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3de0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
3df0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
3e00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
3e10: 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
3e20: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
3e40: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
3e50: 61 62 6c 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20  able as N==K as 
3e60: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 0a  a special case..
3e70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3e80: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  ne allocates the
3e90: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
3ea0: 63 74 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72  ct in heap memor
3eb0: 79 2e 20 54 68 65 20 72 65 74 75 72 6e 20 0a 2a  y. The return .*
3ec0: 2a 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  * value is a poi
3ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
3ee0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20  4Accum object.  
3ef0: 54 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  The datatype of 
3f00: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
3f10: 6c 75 65 20 69 73 20 42 4c 4f 42 2c 20 62 75 74  lue is BLOB, but
3f20: 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   it is really ju
3f30: 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  st a pointer to 
3f40: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 0a 2a  the Stat4Accum.*
3f50: 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  * object..*/.sta
3f60: 74 69 63 20 76 6f 69 64 20 73 74 61 74 49 6e 69  tic void statIni
3f70: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t(.  sqlite3_con
3f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
3fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3fb0: 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75  v.){.  Stat4Accu
3fc0: 6d 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  m *p;.  int nCol
3fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4000: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 61 6d 70  index being samp
4010: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  led */.  int nKe
4020: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4040: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
4050: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55  s */.  int nColU
4060: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4070: 20 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72         /* nCol r
4080: 6f 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c  ounded up for al
4090: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ignment */.  int
40a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
40d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
40e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
4110: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  ection */.#ifdef
4120: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4130: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
4140: 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53  int mxSample = S
4150: 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50  QLITE_STAT4_SAMP
4160: 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  LES;.#endif..  /
4170: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72  * Decode the thr
4180: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
4190: 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45  ments */.  UNUSE
41a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
41b0: 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  );.  nCol = sqli
41c0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
41d0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
41e0: 28 20 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43  ( nCol>0 );.  nC
41f0: 6f 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52  olUp = sizeof(tR
4200: 6f 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c  owcnt)<8 ? (nCol
4210: 2b 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20  +1)&~1 : nCol;. 
4220: 20 6e 4b 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74   nKeyCol = sqlit
4230: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4240: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
4250: 20 6e 4b 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29   nKeyCol<=nCol )
4260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
4270: 43 6f 6c 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  Col>0 );..  /* A
4280: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
4290: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
42a0: 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62  he Stat4Accum ob
42b0: 6a 65 63 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69  ject */.  n = si
42c0: 7a 65 6f 66 28 2a 70 29 20 0a 20 20 20 20 2b 20  zeof(*p) .    + 
42d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
42e0: 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20  nColUp          
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34          /* Stat4
4300: 41 63 63 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20  Accum.anEq */.  
4310: 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63    + sizeof(tRowc
4320: 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20  nt)*nColUp      
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4340: 74 61 74 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20  tat4Accum.anDLt 
4350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4360: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4370: 5f 53 54 41 54 34 0a 20 20 20 20 2b 20 73 69 7a  _STAT4.    + siz
4380: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4390: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
43a0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
43b0: 75 6d 2e 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b  um.anLt */.    +
43c0: 20 73 69 7a 65 6f 66 28 53 74 61 74 34 53 61 6d   sizeof(Stat4Sam
43d0: 70 6c 65 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d  ple)*(nCol+mxSam
43e0: 70 6c 65 29 20 20 20 20 20 2f 2a 20 53 74 61 74  ple)     /* Stat
43f0: 34 41 63 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20  4Accum.aBest[], 
4400: 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a  a[] */.    + siz
4410: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e  eof(tRowcnt)*3*n
4420: 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61  ColUp*(nCol+mxSa
4430: 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b  mple).#endif.  ;
4440: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
4450: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
4460: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20  e(context);.  p 
4470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4480: 63 5a 65 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20  cZero(db, n);.  
4490: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
44a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
44b0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
44c0: 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
44d0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20  .  }..  p->db = 
44e0: 64 62 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20  db;.  p->nRow = 
44f0: 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e  0;.  p->nCol = n
4500: 43 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f  Col;.  p->nKeyCo
4510: 6c 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  l = nKeyCol;.  p
4520: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20  ->current.anDLt 
4530: 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31  = (tRowcnt*)&p[1
4540: 5d 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e  ];.  p->current.
4550: 61 6e 45 71 20 3d 20 26 70 2d 3e 63 75 72 72 65  anEq = &p->curre
4560: 6e 74 2e 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d  nt.anDLt[nColUp]
4570: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4580: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4590: 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 75  _STAT4.  {.    u
45a0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45c0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  * Allocated spac
45d0: 65 20 6e 6f 74 20 79 65 74 20 61 73 73 69 67 6e  e not yet assign
45e0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
4610: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
4620: 6f 75 67 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ough p->aSample[
4630: 5d 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65  ] */..    p->iGe
4640: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d  t = -1;.    p->m
4650: 78 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70  xSample = mxSamp
4660: 6c 65 3b 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d  le;.    p->nPSam
4670: 70 6c 65 20 3d 20 28 74 52 6f 77 63 6e 74 29 28  ple = (tRowcnt)(
4680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4690: 74 36 34 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78  t64(argv[2])/(mx
46a0: 53 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29  Sample/3+1) + 1)
46b0: 3b 0a 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74  ;.    p->current
46c0: 2e 61 6e 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72  .anLt = &p->curr
46d0: 65 6e 74 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d  ent.anEq[nColUp]
46e0: 3b 0a 20 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20  ;.    p->iPrn = 
46f0: 30 78 36 38 39 65 39 36 32 64 2a 28 75 33 32 29  0x689e962d*(u32)
4700: 6e 43 6f 6c 20 5e 20 30 78 64 30 39 34 34 35 36  nCol ^ 0xd094456
4710: 35 2a 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  5*(u32)sqlite3_v
4720: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
4730: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74  );.  .    /* Set
4740: 20 75 70 20 74 68 65 20 53 74 61 74 34 41 63 63   up the Stat4Acc
4750: 75 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74  um.a[] and aBest
4760: 5b 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20  [] arrays */.   
4770: 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20   p->a = (struct 
4780: 53 74 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d  Stat4Sample*)&p-
4790: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43  >current.anLt[nC
47a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42  olUp];.    p->aB
47b0: 65 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61  est = &p->a[mxSa
47c0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63  mple];.    pSpac
47d0: 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b  e = (u8*)(&p->a[
47e0: 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b  mxSample+nCol]);
47f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4800: 28 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b  (mxSample+nCol);
4810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4820: 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f  a[i].anEq = (tRo
4830: 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70  wcnt *)pSpace; p
4840: 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66  Space += (sizeof
4850: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c  (tRowcnt) * nCol
4860: 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  Up);.      p->a[
4870: 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63  i].anLt = (tRowc
4880: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
4890: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
48a0: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70  Rowcnt) * nColUp
48b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  );.      p->a[i]
48c0: 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e  .anDLt = (tRowcn
48d0: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
48e0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
48f0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
4900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4910: 72 74 28 20 28 70 53 70 61 63 65 20 2d 20 28 75  rt( (pSpace - (u
4920: 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20  8*)p)==n );.  . 
4930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4940: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4950: 70 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c  p->aBest[i].iCol
4960: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
4970: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74  #endif..  /* Ret
4980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4990: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f   the allocated o
49a0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c  bject to the cal
49b0: 6c 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  ler.  Note that.
49c0: 20 20 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f    ** only the po
49d0: 69 6e 74 65 72 20 28 74 68 65 20 32 6e 64 20 70  inter (the 2nd p
49e0: 61 72 61 6d 65 74 65 72 29 20 6d 61 74 74 65 72  arameter) matter
49f0: 73 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66 20  s.  The size of 
4a00: 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  the object.  ** 
4a10: 28 67 69 76 65 6e 20 62 79 20 74 68 65 20 33 72  (given by the 3r
4a20: 64 20 70 61 72 61 6d 65 74 65 72 29 20 69 73 20  d parameter) is 
4a30: 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64 20 63  never used and c
4a40: 61 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69  an be any positi
4a50: 76 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a  ve.  ** value. *
4a60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4a70: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4a80: 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20   p, sizeof(*p), 
4a90: 73 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29  stat4Destructor)
4aa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.}.static const
4ab0: 20 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69   FuncDef statIni
4ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32  tFuncdef = {.  2
4ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
4ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
4af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
4b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
4b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
4b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
4b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
4b50: 20 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20    statInit,     
4b60: 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a     /* xSFunc */.
4b70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4b80: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
4b90: 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20  */.  0, 0,      
4ba0: 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c        /* xValue,
4bb0: 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22   xInverse */.  "
4bc0: 73 74 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20  stat_init",     
4bd0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30  /* zName */.  {0
4be0: 7d 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.};..#ifdef SQL
4bf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
4c00: 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20  ./*.** pNew and 
4c10: 70 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61  pOld are both ca
4c20: 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69  ndidate non-peri
4c30: 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c  odic samples sel
4c40: 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68  ected for .** th
4c50: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70  e same column (p
4c60: 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d  New->iCol==pOld-
4c70: 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67  >iCol). Ignoring
4c80: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64   this column and
4c90: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
4ca0: 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69   only any traili
4cb0: 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  ng columns and t
4cc0: 68 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76  he sample hash v
4cd0: 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  alue, this.** fu
4ce0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
4cf0: 72 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e  rue if sample pN
4d00: 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66  ew is to be pref
4d10: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
4d20: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
4d30: 64 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65  ds, if we assume
4d40: 20 74 68 61 74 20 74 68 65 20 63 61 72 64 69 6e   that the cardin
4d50: 61 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20 73  alities of the s
4d60: 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d  elected.** colum
4d70: 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70  n for pNew and p
4d80: 4f 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69  Old are equal, i
4d90: 73 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65  s pNew to be pre
4da0: 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64  ferred over pOld
4db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4dc0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
4dd0: 61 74 20 66 6f 72 20 65 61 63 68 20 61 72 67 75  at for each argu
4de0: 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65  ment sample, the
4df0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
4e00: 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79  the anEq[] array
4e10: 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61   from pSample->a
4e20: 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f  nEq[pSample->iCo
4e30: 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65  l+1] onwards are
4e40: 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74   valid. .*/.stat
4e50: 69 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42  ic int sampleIsB
4e60: 65 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61  etterPost(.  Sta
4e70: 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c  t4Accum *pAccum,
4e80: 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20   .  Stat4Sample 
4e90: 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53  *pNew, .  Stat4S
4ea0: 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20  ample *pOld.){. 
4eb0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63   int nCol = pAcc
4ec0: 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  um->nCol;.  int 
4ed0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  i;.  assert( pNe
4ee0: 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69  w->iCol==pOld->i
4ef0: 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  Col );.  for(i=p
4f00: 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e  New->iCol+1; i<n
4f10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
4f20: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f30: 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  >pOld->anEq[i] )
4f40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4f50: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f60: 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  <pOld->anEq[i] )
4f70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4f80: 20 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68   if( pNew->iHash
4f90: 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72  >pOld->iHash ) r
4fa0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
4fb0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
4fc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4fd0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
4fe0: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
4ff0: 74 72 75 65 20 69 66 20 70 4e 65 77 20 69 73 20  true if pNew is 
5000: 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64 20  to be preferred 
5010: 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a  over pOld..**.**
5020: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5030: 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20  ssumes that for 
5040: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61  each argument sa
5050: 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e  mple, the conten
5060: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45  ts of.** the anE
5070: 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70  q[] array from p
5080: 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61  Sample->anEq[pSa
5090: 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61  mple->iCol] onwa
50a0: 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a  rds are valid. .
50b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
50c0: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20  mpleIsBetter(.  
50d0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63  Stat4Accum *pAcc
50e0: 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70  um, .  Stat4Samp
50f0: 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61  le *pNew, .  Sta
5100: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29  t4Sample *pOld.)
5110: 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e  {.  tRowcnt nEqN
5120: 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b  ew = pNew->anEq[
5130: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74  pNew->iCol];.  t
5140: 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20  Rowcnt nEqOld = 
5150: 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d  pOld->anEq[pOld-
5160: 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  >iCol];..  asser
5170: 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70  t( pOld->isPSamp
5180: 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69  le==0 && pNew->i
5190: 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20  sPSample==0 );. 
51a0: 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34   assert( IsStat4
51b0: 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d   || (pNew->iCol=
51c0: 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c  =0 && pOld->iCol
51d0: 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28  ==0) );..  if( (
51e0: 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29  nEqNew>nEqOld) )
51f0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65   return 1;.#ifde
5200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5210: 53 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e  STAT4.  if( nEqN
5220: 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20  ew==nEqOld ){.  
5230: 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c    if( pNew->iCol
5240: 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65  <pOld->iCol ) re
5250: 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
5260: 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d  rn (pNew->iCol==
5270: 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61  pOld->iCol && sa
5280: 6d 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74  mpleIsBetterPost
5290: 28 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70  (pAccum, pNew, p
52a0: 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Old));.  }.  ret
52b0: 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 0;.#else.  r
52c0: 65 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e  eturn (nEqNew==n
52d0: 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69  EqOld && pNew->i
52e0: 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68  Hash>pOld->iHash
52f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
5300: 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  ** Copy the cont
5310: 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a  ents of sample *
5320: 70 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d  pNew into the p-
5330: 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e  >a[] array. If n
5340: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d  ecessary,.** rem
5350: 6f 76 65 20 74 68 65 20 6c 65 61 73 74 20 64 65  ove the least de
5360: 73 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66  sirable sample f
5370: 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61  rom p->a[] to ma
5380: 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74  ke room..*/.stat
5390: 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e  ic void sampleIn
53a0: 73 65 72 74 28 53 74 61 74 34 41 63 63 75 6d 20  sert(Stat4Accum 
53b0: 2a 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20  *p, Stat4Sample 
53c0: 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65  *pNew, int nEqZe
53d0: 72 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70  ro){.  Stat4Samp
53e0: 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b  le *pSample = 0;
53f0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
5400: 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20  ert( IsStat4 || 
5410: 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23  nEqZero==0 );..#
5420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5430: 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53  BLE_STAT4.  /* S
5440: 74 61 74 34 41 63 63 75 6d 2e 6e 4d 61 78 45 71  tat4Accum.nMaxEq
5450: 5a 65 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  Zero is set to t
5460: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
5470: 72 20 6f 66 20 6c 65 61 64 69 6e 67 20 30 0a 20  r of leading 0. 
5480: 20 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68   ** values in th
5490: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 6f  e anEq[] array o
54a0: 66 20 61 6e 79 20 73 61 6d 70 6c 65 20 69 6e 20  f any sample in 
54b0: 53 74 61 74 34 41 63 63 75 6d 2e 61 5b 5d 2e 20  Stat4Accum.a[]. 
54c0: 49 6e 0a 20 20 2a 2a 20 6f 74 68 65 72 20 77 6f  In.  ** other wo
54d0: 72 64 73 2c 20 69 66 20 6e 4d 61 78 45 71 5a 65  rds, if nMaxEqZe
54e0: 72 6f 20 69 73 20 6e 2c 20 74 68 65 6e 20 69 74  ro is n, then it
54f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
5500: 68 61 74 20 74 68 65 72 65 0a 20 20 2a 2a 20 61  hat there.  ** a
5510: 72 65 20 6e 6f 20 73 61 6d 70 6c 65 73 20 77 69  re no samples wi
5520: 74 68 20 53 74 61 74 34 53 61 6d 70 6c 65 2e 61  th Stat4Sample.a
5530: 6e 45 71 5b 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d  nEq[m]==0 for (m
5540: 3e 3d 6e 29 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  >=n). */.  if( n
5550: 45 71 5a 65 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71  EqZero>p->nMaxEq
5560: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  Zero ){.    p->n
5570: 4d 61 78 45 71 5a 65 72 6f 20 3d 20 6e 45 71 5a  MaxEqZero = nEqZ
5580: 65 72 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ero;.  }.  if( p
5590: 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d  New->isPSample==
55a0: 30 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  0 ){.    Stat4Sa
55b0: 6d 70 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d  mple *pUpgrade =
55c0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
55d0: 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d  pNew->anEq[pNew-
55e0: 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20  >iCol]>0 );..   
55f0: 20 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20   /* This sample 
5600: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 62  is being added b
5610: 65 63 61 75 73 65 20 74 68 65 20 70 72 65 66 69  ecause the prefi
5620: 78 20 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63  x that ends in c
5630: 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43  olumn .    ** iC
5640: 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74  ol occurs many t
5650: 69 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  imes in the tabl
5660: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77  e. However, if w
5670: 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
5680: 20 20 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61     ** added a sa
5690: 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73  mple that shares
56a0: 20 74 68 69 73 20 70 72 65 66 69 78 2c 20 74 68   this prefix, th
56b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
56c0: 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69  o add.    ** thi
56d0: 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20  s one. Instead, 
56e0: 75 70 67 72 61 64 65 20 74 68 65 20 70 72 69 6f  upgrade the prio
56f0: 72 69 74 79 20 6f 66 20 74 68 65 20 68 69 67 68  rity of the high
5700: 65 73 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20  est priority.   
5710: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d   ** existing sam
5720: 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20  ple that shares 
5730: 74 68 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f  this prefix.  */
5740: 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
5750: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
5760: 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34  --){.      Stat4
5770: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26  Sample *pOld = &
5780: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  p->a[i];.      i
5790: 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e  f( pOld->anEq[pN
57a0: 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  ew->iCol]==0 ){.
57b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
57c0: 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65  ->isPSample ) re
57d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
57e0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c  sert( pOld->iCol
57f0: 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20  >pNew->iCol );. 
5800: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5810: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c  ampleIsBetter(p,
5820: 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a   pNew, pOld) );.
5830: 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70 67          if( pUpg
5840: 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c  rade==0 || sampl
5850: 65 49 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c  eIsBetter(p, pOl
5860: 64 2c 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a  d, pUpgrade) ){.
5870: 20 20 20 20 20 20 20 20 20 20 70 55 70 67 72 61            pUpgra
5880: 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  de = pOld;.     
5890: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
58a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70 67 72   }.    if( pUpgr
58b0: 61 64 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70  ade ){.      pUp
58c0: 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e  grade->iCol = pN
58d0: 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20  ew->iCol;.      
58e0: 70 55 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70  pUpgrade->anEq[p
58f0: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d  Upgrade->iCol] =
5900: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67   pNew->anEq[pUpg
5910: 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20  rade->iCol];.   
5920: 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77     goto find_new
5930: 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _min;.    }.  }.
5940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
5950: 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76  necessary, remov
5960: 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f  e sample iMin to
5970: 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
5980: 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a  he new sample. *
5990: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  /.  if( p->nSamp
59a0: 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le>=p->mxSample 
59b0: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
59c0: 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61  le *pMin = &p->a
59d0: 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74  [p->iMin];.    t
59e0: 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70  Rowcnt *anEq = p
59f0: 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74  Min->anEq;.    t
5a00: 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70  Rowcnt *anLt = p
5a10: 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74  Min->anLt;.    t
5a20: 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20  Rowcnt *anDLt = 
5a30: 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20  pMin->anDLt;.   
5a40: 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e   sampleClear(p->
5a50: 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d  db, pMin);.    m
5a60: 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d  emmove(pMin, &pM
5a70: 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d  in[1], sizeof(p-
5a80: 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70  >a[0])*(p->nSamp
5a90: 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a  le-p->iMin-1));.
5aa0: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
5ab0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  ->a[p->nSample-1
5ac0: 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  ];.    pSample->
5ad0: 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  nRowid = 0;.    
5ae0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20  pSample->anEq = 
5af0: 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c  anEq;.    pSampl
5b00: 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74  e->anDLt = anDLt
5b10: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61  ;.    pSample->a
5b20: 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20  nLt = anLt;.    
5b30: 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e  p->nSample = p->
5b40: 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a  mxSample-1;.  }.
5b50: 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20  .  /* The "rows 
5b60: 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74  less-than" for t
5b70: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
5b80: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
5b90: 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66  than that.  ** f
5ba0: 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70  or the last samp
5bb0: 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d  le in the p->a[]
5bc0: 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
5bd0: 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77  e, the samples w
5be0: 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74  ould.  ** be out
5bf0: 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69   of order. */.#i
5c00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5c10: 4c 45 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72  LE_STAT4.  asser
5c20: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30  t( p->nSample==0
5c30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77   .       || pNew
5c40: 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->anLt[p->nCol-1
5c50: 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d  ] > p->a[p->nSam
5c60: 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e  ple-1].anLt[p->n
5c70: 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66  Col-1] );.#endif
5c80: 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
5c90: 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a  e new sample */.
5ca0: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
5cb0: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  a[p->nSample];. 
5cc0: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70   sampleCopy(p, p
5cd0: 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20  Sample, pNew);. 
5ce0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a   p->nSample++;..
5cf0: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
5d00: 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72  rst nEqZero entr
5d10: 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b  ies in the anEq[
5d20: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65  ] array. */.  me
5d30: 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e  mset(pSample->an
5d40: 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52  Eq, 0, sizeof(tR
5d50: 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b  owcnt)*nEqZero);
5d60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d70: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69  ENABLE_STAT4. fi
5d80: 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64  nd_new_min:.#end
5d90: 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  if.  if( p->nSam
5da0: 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65  ple>=p->mxSample
5db0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e   ){.    int iMin
5dc0: 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69   = -1;.    for(i
5dd0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
5de0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
5df0: 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61  f( p->a[i].isPSa
5e00: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
5e10: 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c  .      if( iMin<
5e20: 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  0 || sampleIsBet
5e30: 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69  ter(p, &p->a[iMi
5e40: 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b  n], &p->a[i]) ){
5e50: 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  .        iMin = 
5e60: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
5e70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69  .    assert( iMi
5e80: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  n>=0 );.    p->i
5e90: 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a  Min = iMin;.  }.
5ea0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5eb0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
5ec0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
5ed0: 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f  ** Field iChng o
5ee0: 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
5ef0: 67 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68  g scanned has ch
5f00: 61 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69  anged. So at thi
5f10: 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75  s point.** p->cu
5f20: 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61  rrent contains a
5f30: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66   sample that ref
5f40: 6c 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f  lects the previo
5f50: 75 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a  us row of the.**
5f60: 20 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75   index. The valu
5f70: 65 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d  e of anEq[iChng]
5f80: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
5f90: 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20  anEq[] elements 
5fa0: 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61  are.** correct a
5fb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
5fc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d  .static void sam
5fd0: 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28  plePushPrevious(
5fe0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69  Stat4Accum *p, i
5ff0: 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65  nt iChng){.#ifde
6000: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6010: 53 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a  STAT4.  int i;..
6020: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
6030: 79 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74  y samples from t
6040: 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  he aBest[] array
6050: 20 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65   should be pushe
6060: 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65  d.  ** into Inde
6070: 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74  xSample.a[] at t
6080: 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20  his point.  */. 
6090: 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d   for(i=(p->nCol-
60a0: 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d  2); i>=iChng; i-
60b0: 2d 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d  -){.    Stat4Sam
60c0: 70 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d  ple *pBest = &p-
60d0: 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70  >aBest[i];.    p
60e0: 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20  Best->anEq[i] = 
60f0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6100: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
6110: 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70  Sample<p->mxSamp
6120: 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65  le || sampleIsBe
6130: 74 74 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26  tter(p, pBest, &
6140: 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29  p->a[p->iMin]) )
6150: 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e  {.      sampleIn
6160: 73 65 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69  sert(p, pBest, i
6170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
6180: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6e 6f  /* Check that no
6190: 20 73 61 6d 70 6c 65 20 63 6f 6e 74 61 69 6e 73   sample contains
61a0: 20 61 6e 20 61 6e 45 71 5b 5d 20 65 6e 74 72 79   an anEq[] entry
61b0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f   with an index o
61c0: 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71  f.  ** p->nMaxEq
61d0: 5a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20  Zero or greater 
61e0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a  set to zero. */.
61f0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70    for(i=p->nSamp
6200: 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  le-1; i>=0; i--)
6210: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
6220: 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71   for(j=p->nMaxEq
6230: 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  Zero; j<p->nCol;
6240: 20 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   j++) assert( p-
6250: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20  >a[i].anEq[j]>0 
6260: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
6270: 61 74 65 20 74 68 65 20 61 6e 45 71 5b 5d 20 66  ate the anEq[] f
6280: 69 65 6c 64 73 20 6f 66 20 61 6e 79 20 73 61 6d  ields of any sam
6290: 70 6c 65 73 20 61 6c 72 65 61 64 79 20 63 6f 6c  ples already col
62a0: 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20 69 66 28  lected. */.  if(
62b0: 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71   iChng<p->nMaxEq
62c0: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28  Zero ){.    for(
62d0: 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20  i=p->nSample-1; 
62e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
62f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
6300: 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d  or(j=iChng; j<p-
6310: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
6320: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d       if( p->a[i]
6330: 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d  .anEq[j]==0 ) p-
6340: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20  >a[i].anEq[j] = 
6350: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6360: 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
6370: 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a  }.    p->nMaxEqZ
6380: 65 72 6f 20 3d 20 69 43 68 6e 67 3b 0a 20 20 7d  ero = iChng;.  }
6390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
63a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
63b0: 4c 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65  LE_STAT3) && !de
63c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
63d0: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28  BLE_STAT4).  if(
63e0: 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20   iChng==0 ){.   
63f0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
6400: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30  ->current.anLt[0
6410: 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ];.    tRowcnt n
6420: 45 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Eq = p->current.
6430: 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  anEq[0];..    /*
6440: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
6450: 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64  s to be a period
6460: 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f  ic sample. If so
6470: 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20  , add it. */.   
6480: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
6490: 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71  ample)!=(nLt+nEq
64a0: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
64b0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
64c0: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
64d0: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
64e0: 65 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ert(p, &p->curre
64f0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  nt, 0);.      p-
6500: 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70  >current.isPSamp
6510: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
6520: 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66  e ..    /* Or if
6530: 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72   it is a non-per
6540: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64  iodic sample. Ad
6550: 64 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73  d it in this cas
6560: 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66  e too. */.    if
6570: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
6580: 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c  mxSample .     |
6590: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
65a0: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
65b0: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
65c0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
65d0: 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26  ampleInsert(p, &
65e0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a  p->current, 0);.
65f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6600: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6610: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
6620: 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f  _STAT4.  UNUSED_
6630: 50 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a  PARAMETER( p );.
6640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6650: 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e  ER( iChng );.#en
6660: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  dif.}../*.** Imp
6670: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6680: 68 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c  he stat_push SQL
6690: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74   function:  stat
66a0: 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20  _push(P,C,R).** 
66b0: 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  Arguments:.**.**
66c0: 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65      P     Pointe
66d0: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
66e0: 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74  cum object creat
66f0: 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28  ed by stat_init(
6700: 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e  ).**    C     In
6710: 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  dex of left-most
6720: 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65   column to diffe
6730: 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  r from previous 
6740: 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20  row.**    R     
6750: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  Rowid for the cu
6760: 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68  rrent row.  Migh
6770: 74 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72  t be a key recor
6780: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
6790: 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20    WITHOUT ROWID 
67a0: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
67b0: 69 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  is SQL function 
67c0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e  always returns N
67d0: 55 4c 4c 2e 20 20 49 74 27 73 20 70 75 72 70 6f  ULL.  It's purpo
67e0: 73 65 20 69 74 20 74 6f 20 61 63 63 75 6d 75 6c  se it to accumul
67f0: 61 74 65 0a 2a 2a 20 73 74 61 74 69 73 74 69 63  ate.** statistic
6800: 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f 72 20 73  al data and/or s
6810: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 53 74  amples in the St
6820: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
6830: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64  about the.** ind
6840: 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ex being analyze
6850: 64 2e 20 20 54 68 65 20 73 74 61 74 5f 67 65 74  d.  The stat_get
6860: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
6870: 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 75 73  will later be us
6880: 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74  ed to.** extract
6890: 20 72 65 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d   relevant inform
68a0: 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72  ation for constr
68b0: 75 63 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74  ucting the sqlit
68c0: 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a  e_statN tables..
68d0: 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61  **.** The R para
68e0: 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73  meter is only us
68f0: 65 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64  ed for STAT3 and
6900: 20 53 54 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63   STAT4.*/.static
6910: 20 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a   void statPush(.
6920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6960: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
6970: 20 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   The three funct
6980: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
6990: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
69a0: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
69b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
69c0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
69d0: 6e 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74  nt iChng = sqlit
69e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
69f0: 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44  v[1]);..  UNUSED
6a00: 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63  _PARAMETER( argc
6a10: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
6a20: 41 4d 45 54 45 52 28 20 63 6f 6e 74 65 78 74 20  AMETER( context 
6a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6a40: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65  nCol>0 );.  asse
6a50: 72 74 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f  rt( iChng<p->nCo
6a60: 6c 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  l );..  if( p->n
6a70: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Row==0 ){.    /*
6a80: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
6a90: 73 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  st call to this 
6aa0: 66 75 6e 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69  function. Do ini
6ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a  tialization. */.
6ac0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6ad0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e  ->nCol; i++) p->
6ae0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6af0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
6b00: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20    /* Second and 
6b10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
6b20: 20 67 65 74 20 70 72 6f 63 65 73 73 65 64 20 68   get processed h
6b30: 65 72 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c  ere */.    sampl
6b40: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c  ePushPrevious(p,
6b50: 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a   iChng);..    /*
6b60: 20 55 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c   Update anDLt[],
6b70: 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71   anLt[] and anEq
6b80: 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  [] to reflect th
6b90: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 70  e values that ap
6ba0: 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ply.    ** to th
6bb0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
6bc0: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   the index. */. 
6bd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43     for(i=0; i<iC
6be0: 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  hng; i++){.     
6bf0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
6c00: 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]++;.    }.   
6c10: 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c   for(i=iChng; i<
6c20: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6c30: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
6c40: 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64  anDLt[i]++;.#ifd
6c50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6c60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6c70: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6c80: 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63  .anLt[i] += p->c
6c90: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a  urrent.anEq[i];.
6ca0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e  #endif.      p->
6cb0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6cc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
6cd0: 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64   p->nRow++;.#ifd
6ce0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6cf0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6d00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
6d10: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d  lue_type(argv[2]
6d20: 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )==SQLITE_INTEGE
6d30: 52 20 29 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  R ){.    sampleS
6d40: 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e  etRowidInt64(p->
6d50: 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  db, &p->current,
6d60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6d70: 6e 74 36 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a  nt64(argv[2]));.
6d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d    }else{.    sam
6d90: 70 6c 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64  pleSetRowid(p->d
6da0: 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  b, &p->current, 
6db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6dc0: 74 65 73 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20  tes(argv[2]),.  
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6e00: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29  ue_blob(argv[2])
6e10: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72  );.  }.  p->curr
6e20: 65 6e 74 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69  ent.iHash = p->i
6e30: 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31  Prn = p->iPrn*11
6e40: 30 33 35 31 35 32 34 35 20 2b 20 31 32 33 34 35  03515245 + 12345
6e50: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
6e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6e70: 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f  TAT4.  {.    tRo
6e80: 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75  wcnt nLt = p->cu
6e90: 72 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43  rrent.anLt[p->nC
6ea0: 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43  ol-1];..    /* C
6eb0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
6ec0: 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63  to be a periodic
6ed0: 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20   sample. If so, 
6ee0: 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  add it. */.    i
6ef0: 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d  f( (nLt/p->nPSam
6f00: 70 6c 65 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d  ple)!=(nLt+1)/p-
6f10: 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >nPSample ){.   
6f20: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6f30: 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20  PSample = 1;.   
6f40: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43     p->current.iC
6f50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 61  ol = 0;.      sa
6f60: 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70  mpleInsert(p, &p
6f70: 2d 3e 63 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43  ->current, p->nC
6f80: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ol-1);.      p->
6f90: 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c  current.isPSampl
6fa0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
6fb0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6fc0: 61 42 65 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a  aBest[] array. *
6fd0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6fe0: 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b  <(p->nCol-1); i+
6ff0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  +){.      p->cur
7000: 72 65 6e 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20  rent.iCol = i;. 
7010: 20 20 20 20 20 69 66 28 20 69 3e 3d 69 43 68 6e       if( i>=iChn
7020: 67 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  g || sampleIsBet
7030: 74 65 72 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63  terPost(p, &p->c
7040: 75 72 72 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73  urrent, &p->aBes
7050: 74 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t[i]) ){.       
7060: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26   sampleCopy(p, &
7070: 70 2d 3e 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d  p->aBest[i], &p-
7080: 3e 63 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20  >current);.     
7090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
70a0: 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e  dif.}.static con
70b0: 73 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 50  st FuncDef statP
70c0: 75 73 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20  ushFuncdef = {. 
70d0: 20 32 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20   2+IsStat34,    
70e0: 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53    /* nArg */.  S
70f0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20  QLITE_UTF8,     
7100: 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a  /* funcFlags */.
7110: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7120: 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20     /* pUserData 
7130: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7140: 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
7150: 2f 0a 20 20 73 74 61 74 50 75 73 68 2c 20 20 20  /.  statPush,   
7160: 20 20 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a       /* xSFunc *
7170: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
7180: 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a       /* xFinaliz
7190: 65 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20  e */.  0, 0,    
71a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75          /* xValu
71b0: 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20  e, xInverse */. 
71c0: 20 22 73 74 61 74 5f 70 75 73 68 22 2c 20 20 20   "stat_push",   
71d0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
71e0: 7b 30 7d 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  {0}.};..#define 
71f0: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 30  STAT_GET_STAT1 0
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 74            /* "st
7210: 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  at" column of st
7220: 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  at1 table */.#de
7230: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 52 4f  fine STAT_GET_RO
7240: 57 49 44 20 31 20 20 20 20 20 20 20 20 20 20 2f  WID 1          /
7250: 2a 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  * "rowid" column
7260: 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74   of stat[34] ent
7270: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ry */.#define ST
7280: 41 54 5f 47 45 54 5f 4e 45 51 20 20 20 32 20 20  AT_GET_NEQ   2  
7290: 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 65 71 22          /* "neq"
72a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b   column of stat[
72b0: 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65  34] entry */.#de
72c0: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c  fine STAT_GET_NL
72d0: 54 20 20 20 33 20 20 20 20 20 20 20 20 20 20 2f  T   3          /
72e0: 2a 20 22 6e 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f  * "nlt" column o
72f0: 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79  f stat[34] entry
7300: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54   */.#define STAT
7310: 5f 47 45 54 5f 4e 44 4c 54 20 20 34 20 20 20 20  _GET_NDLT  4    
7320: 20 20 20 20 20 20 2f 2a 20 22 6e 64 6c 74 22 20        /* "ndlt" 
7330: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
7340: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a  4] entry */../*.
7350: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7360: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 5f 67 65  n of the stat_ge
7370: 74 28 50 2c 4a 29 20 53 51 4c 20 66 75 6e 63 74  t(P,J) SQL funct
7380: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
7390: 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  ne is.** used to
73a0: 20 71 75 65 72 79 20 73 74 61 74 69 73 74 69 63   query statistic
73b0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  al information t
73c0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 67 61 74  hat has been gat
73d0: 68 65 72 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  hered into.** th
73e0: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
73f0: 65 63 74 20 62 79 20 70 72 69 6f 72 20 63 61 6c  ect by prior cal
7400: 6c 73 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28  ls to stat_push(
7410: 29 2e 20 20 54 68 65 20 50 20 70 61 72 61 6d 65  ).  The P parame
7420: 74 65 72 0a 2a 2a 20 68 61 73 20 74 79 70 65 20  ter.** has type 
7430: 42 4c 4f 42 20 62 75 74 20 69 74 20 69 73 20 72  BLOB but it is r
7440: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69  eally just a poi
7450: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
7460: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a  4Accum object..*
7470: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f  * The content to
7480: 20 72 65 74 75 72 6e 65 64 20 69 73 20 64 65 74   returned is det
7490: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
74a0: 61 72 61 6d 65 74 65 72 20 4a 0a 2a 2a 20 77 68  arameter J.** wh
74b0: 69 63 68 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ich is one of th
74c0: 65 20 53 54 41 54 5f 47 45 54 5f 78 78 78 78 20  e STAT_GET_xxxx 
74d0: 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 61  values defined a
74e0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bove..**.** The 
74f0: 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 66 75  stat_get(P,J) fu
7500: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
7510: 61 69 6c 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ailable to gener
7520: 69 63 20 53 51 4c 2e 20 20 49 74 20 69 73 0a 2a  ic SQL.  It is.*
7530: 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
7540: 72 74 20 6f 66 20 61 20 6d 61 6e 75 61 6c 6c 79  rt of a manually
7550: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 74   constructed byt
7560: 65 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20 20  ecode program.  
7570: 28 53 65 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  (See.** the call
7580: 53 74 61 74 47 65 74 28 29 20 72 6f 75 74 69 6e  StatGet() routin
7590: 65 20 62 65 6c 6f 77 2e 29 20 20 49 74 20 69 73  e below.)  It is
75a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
75b0: 20 74 68 65 20 50 0a 2a 2a 20 70 61 72 61 6d 65   the P.** parame
75c0: 74 65 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ter will always 
75d0: 62 65 20 61 20 70 6f 69 6e 65 72 20 74 6f 20 61  be a poiner to a
75e0: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
75f0: 63 74 2c 20 6e 65 76 65 72 20 61 0a 2a 2a 20 4e  ct, never a.** N
7600: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ULL..**.** If ne
7610: 69 74 68 65 72 20 53 54 41 54 33 20 6e 6f 72 20  ither STAT3 nor 
7620: 53 54 41 54 34 20 61 72 65 20 65 6e 61 62 6c 65  STAT4 are enable
7630: 64 2c 20 74 68 65 6e 20 4a 20 69 73 20 61 6c 77  d, then J is alw
7640: 61 79 73 0a 2a 2a 20 53 54 41 54 5f 47 45 54 5f  ays.** STAT_GET_
7650: 53 54 41 54 31 20 61 6e 64 20 69 73 20 68 65 6e  STAT1 and is hen
7660: 63 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  ce omitted and t
7670: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 63 6f  his routine beco
7680: 6d 65 73 0a 2a 2a 20 61 20 6f 6e 65 2d 70 61 72  mes.** a one-par
7690: 61 6d 65 74 65 72 20 66 75 6e 63 74 69 6f 6e 2c  ameter function,
76a0: 20 73 74 61 74 5f 67 65 74 28 50 29 2c 20 74 68   stat_get(P), th
76b0: 61 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  at always return
76c0: 73 20 74 68 65 0a 2a 2a 20 73 74 61 74 31 20 74  s the.** stat1 t
76d0: 61 62 6c 65 20 65 6e 74 72 79 20 69 6e 66 6f 72  able entry infor
76e0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
76f0: 63 20 76 6f 69 64 20 73 74 61 74 47 65 74 28 0a  c void statGet(.
7700: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7710: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7720: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7730: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7740: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
7750: 70 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a  p = (Stat4Accum*
7760: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
7770: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  lob(argv[0]);.#i
7780: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7790: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
77a0: 34 0a 20 20 2f 2a 20 53 54 41 54 33 20 61 6e 64  4.  /* STAT3 and
77b0: 20 53 54 41 54 34 20 68 61 76 65 20 61 20 70 61   STAT4 have a pa
77c0: 72 61 6d 65 74 65 72 20 6f 6e 20 74 68 69 73 20  rameter on this 
77d0: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e  routine. */.  in
77e0: 74 20 65 43 61 6c 6c 20 3d 20 73 71 6c 69 74 65  t eCall = sqlite
77f0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
7800: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
7810: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 61 73 73  argc==2 );.  ass
7820: 65 72 74 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54  ert( eCall==STAT
7830: 5f 47 45 54 5f 53 54 41 54 31 20 7c 7c 20 65 43  _GET_STAT1 || eC
7840: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 45  all==STAT_GET_NE
7850: 51 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61  Q .       || eCa
7860: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7870: 49 44 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41  ID || eCall==STA
7880: 54 5f 47 45 54 5f 4e 4c 54 0a 20 20 20 20 20 20  T_GET_NLT.      
7890: 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f   || eCall==STAT_
78a0: 47 45 54 5f 4e 44 4c 54 20 0a 20 20 29 3b 0a 20  GET_NDLT .  );. 
78b0: 20 69 66 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54   if( eCall==STAT
78c0: 5f 47 45 54 5f 53 54 41 54 31 20 29 0a 23 65 6c  _GET_STAT1 ).#el
78d0: 73 65 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  se.  assert( arg
78e0: 63 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20  c==1 );.#endif. 
78f0: 20 7b 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e   {.    /* Return
7900: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 73 74   the value to st
7910: 6f 72 65 20 69 6e 20 74 68 65 20 22 73 74 61 74  ore in the "stat
7920: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
7930: 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 20 20 20  sqlite_stat1.   
7940: 20 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 74 68   ** table for th
7950: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  is index..    **
7960: 0a 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  .    ** The valu
7970: 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f  e is a string co
7980: 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74  mposed of a list
7990: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 64 65 73   of integers des
79a0: 63 72 69 62 69 6e 67 20 0a 20 20 20 20 2a 2a 20  cribing .    ** 
79b0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 20 66  the index. The f
79c0: 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20  irst integer in 
79d0: 74 68 65 20 6c 69 73 74 20 69 73 20 74 68 65 20  the list is the 
79e0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
79f0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
7a00: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
7a10: 65 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74  ere is one addit
7a20: 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e  ional integer in
7a30: 20 74 68 65 20 6c 69 73 74 20 0a 20 20 20 20 2a   the list .    *
7a40: 2a 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  * for each index
7a50: 65 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ed column. This 
7a60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
7a70: 65 72 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  er is an estimat
7a80: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
7a90: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
7aa0: 61 74 63 68 65 64 20 62 79 20 61 20 73 74 61 62  atched by a stab
7ab0: 62 69 6e 67 20 71 75 65 72 79 20 6f 6e 20 74 68  bing query on th
7ac0: 65 20 69 6e 64 65 78 20 75 73 69 6e 67 0a 20 20  e index using.  
7ad0: 20 20 2a 2a 20 61 20 6b 65 79 20 77 69 74 68 20    ** a key with 
7ae0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7af0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  g number of fiel
7b00: 64 73 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ds. In other wor
7b10: 64 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ds,.    ** if th
7b20: 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 63 6f  e index is on co
7b30: 6c 75 6d 6e 73 20 28 61 2c 62 29 20 61 6e 64 20  lumns (a,b) and 
7b40: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
7b50: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 2a   value is .    *
7b60: 2a 20 22 31 30 30 20 31 30 20 32 22 2c 20 74 68  * "100 10 2", th
7b70: 65 6e 20 53 51 4c 69 74 65 20 65 73 74 69 6d 61  en SQLite estima
7b80: 74 65 73 20 74 68 61 74 3a 0a 20 20 20 20 2a 2a  tes that:.    **
7b90: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 74 68 65 20  .    **   * the 
7ba0: 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 31  index contains 1
7bb0: 30 30 20 72 6f 77 73 2c 0a 20 20 20 20 2a 2a 20  00 rows,.    ** 
7bc0: 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 22 20    * "WHERE a=?" 
7bd0: 6d 61 74 63 68 65 73 20 31 30 20 72 6f 77 73 2c  matches 10 rows,
7be0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 2a 20   and.    **   * 
7bf0: 22 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62  "WHERE a=? AND b
7c00: 3d 3f 22 20 6d 61 74 63 68 65 73 20 32 20 72 6f  =?" matches 2 ro
7c10: 77 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws..    **.    *
7c20: 2a 20 49 66 20 44 20 69 73 20 74 68 65 20 63 6f  * If D is the co
7c30: 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63 74 20  unt of distinct 
7c40: 76 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20  values and K is 
7c50: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7c60: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 6f 77 73   of .    ** rows
7c70: 2c 20 74 68 65 6e 20 65 61 63 68 20 65 73 74 69  , then each esti
7c80: 6d 61 74 65 20 69 73 20 63 6f 6d 70 75 74 65 64  mate is computed
7c90: 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   as:.    **.    
7ca0: 2a 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b  **        I = (K
7cb0: 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2f 0a 20  +D-1)/D.    */. 
7cc0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
7cd0: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 63 68 61 72  int i;..    char
7ce0: 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *zRet = sqlite3
7cf0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 28 70 2d 3e  MallocZero( (p->
7d00: 6e 4b 65 79 43 6f 6c 2b 31 29 2a 32 35 20 29 3b  nKeyCol+1)*25 );
7d10: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
7d20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d30: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7d40: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
7d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7d60: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
7d70: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65  snprintf(24, zRe
7d80: 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29  t, "%llu", (u64)
7d90: 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20  p->nRow);.    z 
7da0: 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33  = zRet + sqlite3
7db0: 53 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a  Strlen30(zRet);.
7dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7dd0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
7de0: 0a 20 20 20 20 20 20 75 36 34 20 6e 44 69 73 74  .      u64 nDist
7df0: 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e  inct = p->curren
7e00: 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a  t.anDLt[i] + 1;.
7e10: 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20 3d        u64 iVal =
7e20: 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69 73   (p->nRow + nDis
7e30: 74 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44 69  tinct - 1) / nDi
7e40: 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73 71  stinct;.      sq
7e50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
7e60: 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20 69  4, z, " %llu", i
7e70: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  Val);.      z +=
7e80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7e90: 28 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (z);.      asser
7ea0: 74 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  t( p->current.an
7eb0: 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a 20  Eq[i] );.    }. 
7ec0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
7ed0: 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20  ='\0' && z>zRet 
7ee0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
7ef0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
7f00: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
7f10: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
7f20: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7f30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
7f40: 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66 28  STAT4.  else if(
7f50: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7f60: 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69 66  _ROWID ){.    if
7f70: 28 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a 20  ( p->iGet<0 ){. 
7f80: 20 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68 50       samplePushP
7f90: 72 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a 20  revious(p, 0);. 
7fa0: 20 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20 30       p->iGet = 0
7fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7fc0: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
7fd0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61 74  le ){.      Stat
7fe0: 34 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70 2d  4Sample *pS = p-
7ff0: 3e 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20 20  >a + p->iGet;.  
8000: 20 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f 77      if( pS->nRow
8010: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  id==0 ){.       
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
8040: 53 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  S->u.iRowid);.  
8050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8070: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
8080: 70 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 53  pS->u.aRowid, pS
8090: 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  ->nRowid,.      
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
80c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
80d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
80e0: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43 6e      tRowcnt *aCn
80f0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  t = 0;..    asse
8100: 72 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e  rt( p->iGet<p->n
8110: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73 77  Sample );.    sw
8120: 69 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a 20  itch( eCall ){. 
8130: 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f 47       case STAT_G
8140: 45 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d 20  ET_NEQ:  aCnt = 
8150: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
8160: 45 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Eq; break;.     
8170: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
8180: 4c 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  LT:  aCnt = p->a
8190: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b 20  [p->iGet].anLt; 
81a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
81b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
81c0: 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69  aCnt = p->a[p->i
81d0: 47 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20 20  Get].anDLt; .   
81e0: 20 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a       p->iGet++;.
81f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8210: 20 20 69 66 28 20 49 73 53 74 61 74 33 20 29 7b    if( IsStat3 ){
8220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8230: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
8240: 65 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b 30  ext, (i64)aCnt[0
8250: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
8260: 20 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20       char *zRet 
8270: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
8280: 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35  ero(p->nCol * 25
8290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65  );.      if( zRe
82a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
82b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
82c0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
82d0: 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xt);.      }else
82e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
82f0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8300: 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20   = zRet;.       
8310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8320: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8340: 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c  rintf(24, z, "%l
8350: 6c 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74 5b  lu ", (u64)aCnt[
8360: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  i]);.          z
8370: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8380: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  n30(z);.        
8390: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
83a0: 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20  ( z[0]=='\0' && 
83b0: 7a 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20 20  z>zRet );.      
83c0: 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a    z[-1] = '\0';.
83d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
83e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
83f0: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
8400: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
8410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8420: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8430: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
8440: 5f 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64 65  _STAT4 */.#ifnde
8450: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8460: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8470: 52 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64 69  R( argc );.#endi
8480: 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  f.}.static const
8490: 20 46 75 6e 63 44 65 66 20 73 74 61 74 47 65 74   FuncDef statGet
84a0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
84b0: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
84c0: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
84d0: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
84e0: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
84f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8500: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
8510: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
8520: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
8530: 20 73 74 61 74 47 65 74 2c 20 20 20 20 20 20 20   statGet,       
8540: 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20    /* xSFunc */. 
8550: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
8560: 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a    /* xFinalize *
8570: 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  /.  0, 0,       
8580: 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20       /* xValue, 
8590: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73  xInverse */.  "s
85a0: 74 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f  tat_get",      /
85b0: 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d  * zName */.  {0}
85c0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
85d0: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62   callStatGet(Vdb
85e0: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61  e *v, int regSta
85f0: 74 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20  t4, int iParam, 
8600: 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61  int regOut){.  a
8610: 73 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72  ssert( regOut!=r
8620: 65 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75  egStat4 && regOu
8630: 74 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b  t!=regStat4+1 );
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8650: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8660: 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64  TAT4.  sqlite3Vd
8670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8680: 6e 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20  nteger, iParam, 
8690: 72 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c  regStat4+1);.#el
86a0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
86b0: 20 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d    assert( iParam
86c0: 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31  ==STAT_GET_STAT1
86d0: 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53   );.#else.  UNUS
86e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50  ED_PARAMETER( iP
86f0: 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20  aram );.#endif. 
8700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8710: 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
8720: 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c  n0, 0, regStat4,
8730: 20 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20   regOut,.       
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
8750: 61 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63  ar*)&statGetFunc
8760: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
8770: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
8780: 68 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49  hangeP5(v, 1 + I
8790: 73 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a  sStat34);.}../*.
87a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
87b0: 20 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73   to do an analys
87c0: 69 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65  is of all indice
87d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
87e0: 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  h.** a single ta
87f0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
8800: 6f 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61  oid analyzeOneTa
8810: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
8820: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
8830: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
8840: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8850: 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69  /* Table whose i
8860: 6e 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65  ndices are to be
8870: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
8880: 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20  ndex *pOnlyIdx, 
8890: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
88a0: 6f 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69  only analyze thi
88b0: 73 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s one index */. 
88c0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
88d0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64    /* Index of Vd
88e0: 62 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72  beCursor that wr
88f0: 69 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  ites the sqlite_
8900: 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20  stat1 table */. 
8910: 20 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20   int iMem,      
8920: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
8930: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
8940: 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20  begin here */.  
8950: 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20  int iTab        
8960: 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
8970: 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  le cursor */.){.
8980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8990: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f  pParse->db;    /
89a0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
89b0: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
89c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
89d0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
89e0: 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  to being analyze
89f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  d */.  int iIdxC
8a00: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
8a10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
8a20: 65 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e  en on index bein
8a30: 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
8a40: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a60: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a  Table cursor */.
8a70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a90: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
8aa0: 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c  chine being buil
8ab0: 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  t up */.  int i;
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8ae0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8af0: 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20  jZeroRows = -1; 
8b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
8b10: 20 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75   from here if nu
8b20: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20  mber of rows is 
8b30: 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44  zero */.  int iD
8b40: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8b50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8b60: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
8b70: 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20  aining pTab */. 
8b80: 20 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74   u8 needTableCnt
8b90: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 1;         /*
8ba0: 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74   True to count t
8bb0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
8bc0: 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  t regNewRowid = 
8bd0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f  iMem++;    /* Ro
8be0: 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65  wid for the inse
8bf0: 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rted record */. 
8c00: 20 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20   int regStat4 = 
8c10: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a  iMem++;       /*
8c20: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
8c30: 64 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  d Stat4Accum obj
8c40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ect */.  int reg
8c50: 43 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  Chng = iMem++;  
8c60: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8c70: 66 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20  f changed index 
8c80: 66 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20  field */.#ifdef 
8c90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
8ca0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
8cb0: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d  nt regRowid = iM
8cc0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52  em++;       /* R
8cd0: 6f 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61  owid argument pa
8ce0: 73 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73  ssed to stat_pus
8cf0: 68 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  h() */.#endif.  
8d00: 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d  int regTemp = iM
8d10: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20  em++;        /* 
8d20: 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
8d30: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
8d40: 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65  regTabname = iMe
8d50: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8d60: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8d70: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
8d80: 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d  int regIdxname =
8d90: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20   iMem++;     /* 
8da0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
8db0: 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a  ing index name *
8dc0: 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31  /.  int regStat1
8dd0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
8de0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68   /* Value for th
8df0: 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66  e stat column of
8e00: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f   sqlite_stat1 */
8e10: 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d  .  int regPrev =
8e20: 20 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   iMem;          
8e30: 2f 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20  /* MUST BE LAST 
8e40: 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23  (see below) */.#
8e50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e60: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
8e70: 4f 4b 0a 20 20 54 61 62 6c 65 20 2a 70 53 74 61  OK.  Table *pSta
8e80: 74 31 20 3d 20 30 3b 20 0a 23 65 6e 64 69 66 0a  t1 = 0; .#endif.
8e90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
8ea0: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d  = MAX(pParse->nM
8eb0: 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d  em, iMem);.  v =
8ec0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8ed0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8ee0: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61  ==0 || NEVER(pTa
8ef0: 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  b==0) ){.    ret
8f00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
8f10: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  Tab->tnum==0 ){.
8f20: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61      /* Do not ga
8f30: 74 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20  ther statistics 
8f40: 6f 6e 20 76 69 65 77 73 20 6f 72 20 76 69 72 74  on views or virt
8f50: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
8f60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
8f80: 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22  ike("sqlite\\_%"
8f90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 27  , pTab->zName, '
8fa0: 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  \\')==0 ){.    /
8fb0: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
8fc0: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79  statistics on sy
8fd0: 73 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  stem tables */. 
8fe0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8ff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9000: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
9010: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44  exes(db) );.  iD
9020: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
9030: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
9040: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
9050: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
9060: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9070: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
9080: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
9090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
90a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
90b0: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
90c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
90d0: 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  , SQLITE_ANALYZE
90e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
90f0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
9100: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
9110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9120: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
9130: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9140: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
9150: 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64   if( db->xPreUpd
9160: 61 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ateCallback ){. 
9170: 20 20 20 70 53 74 61 74 31 20 3d 20 28 54 61 62     pStat1 = (Tab
9180: 6c 65 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  le*)sqlite3DbMal
9190: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
91a0: 6f 66 28 54 61 62 6c 65 29 20 2b 20 31 33 29 3b  of(Table) + 13);
91b0: 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 31 3d  .    if( pStat1=
91c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
91d0: 20 70 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d   pStat1->zName =
91e0: 20 28 63 68 61 72 2a 29 26 70 53 74 61 74 31 5b   (char*)&pStat1[
91f0: 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
9200: 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73  Stat1->zName, "s
9210: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 31 33  qlite_stat1", 13
9220: 29 3b 0a 20 20 20 20 70 53 74 61 74 31 2d 3e 6e  );.    pStat1->n
9230: 43 6f 6c 20 3d 20 33 3b 0a 20 20 20 20 70 53 74  Col = 3;.    pSt
9240: 61 74 31 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  at1->iPKey = -1;
9250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9260: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
9270: 56 64 62 65 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Vdbe, OP_Noop, 0
9280: 2c 20 30 2c 20 30 2c 28 63 68 61 72 2a 29 70 53  , 0, 0,(char*)pS
9290: 74 61 74 31 2c 50 34 5f 44 59 4e 42 4c 4f 42 29  tat1,P4_DYNBLOB)
92a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
92b0: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72  /* Establish a r
92c0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
92d0: 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61  table at the sha
92e0: 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e  red-cache level.
92f0: 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65   .  ** Open a re
9300: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
9310: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73  n the table. Als
9320: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  o allocate a cur
9330: 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  sor number.  ** 
9340: 74 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e  to use for scann
9350: 69 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64  ing indexes (iId
9360: 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20  xCur). No index 
9370: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
9380: 20 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69   at.  ** this ti
9390: 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20  me though.  */. 
93a0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
93b0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
93c0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
93d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54  ab->zName);.  iT
93e0: 61 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  abCur = iTab++;.
93f0: 20 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62    iIdxCur = iTab
9400: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ++;.  pParse->nT
9410: 61 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  ab = MAX(pParse-
9420: 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20  >nTab, iTab);.  
9430: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
9440: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
9450: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
9460: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c  OpenRead);.  sql
9470: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
9480: 6e 67 28 76 2c 20 72 65 67 54 61 62 6e 61 6d 65  ng(v, regTabname
9490: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
94a0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
94b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
94c0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
94d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  ){.    int nCol;
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9500: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64  f columns in pId
9510: 78 2e 20 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e  x. "N" */.    in
9520: 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20  t addrRewind;   
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9540: 64 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65  ddress of "OP_Re
9550: 77 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f  wind iIdxCur" */
9560: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
9570: 74 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  tRow;           
9580: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
9590: 20 22 6e 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a   "next_row:" */.
95a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
95b0: 7a 49 64 78 4e 61 6d 65 3b 20 20 20 20 20 20 20  zIdxName;       
95c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
95d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
95e0: 74 20 6e 43 6f 6c 54 65 73 74 3b 20 20 20 20 20  t nColTest;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9600: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9610: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 63 68 61   to test for cha
9620: 6e 67 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28  nges */..    if(
9630: 20 70 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e   pOnlyIdx && pOn
9640: 6c 79 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f  lyIdx!=pIdx ) co
9650: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9660: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
9670: 65 72 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62  ere==0 ) needTab
9680: 6c 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  leCnt = 0;.    i
9690: 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
96a0: 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
96b0: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  eyIndex(pIdx) ){
96c0: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
96d0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
96e0: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54     zIdxName = pT
96f0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9700: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c   nColTest = nCol
9710: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
9720: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
9730: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
9740: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49     zIdxName = pI
9750: 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  dx->zName;.     
9760: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 70 49 64 78   nColTest = pIdx
9770: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
9780: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20  pIdx->nKeyCol-1 
9790: 3a 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a  : nCol-1;.    }.
97a0: 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
97b0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 63 6f   the register co
97c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
97d0: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ex name. */.    
97e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
97f0: 74 72 69 6e 67 28 76 2c 20 72 65 67 49 64 78 6e  tring(v, regIdxn
9800: 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a  ame, zIdxName);.
9810: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9820: 28 76 2c 20 22 41 6e 61 6c 79 73 69 73 20 66 6f  (v, "Analysis fo
9830: 72 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e  r %s.%s", pTab->
9840: 7a 4e 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29  zName, zIdxName)
9850: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
9860: 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f  * Pseudo-code fo
9870: 72 20 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c  r loop that call
9880: 73 20 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20  s stat_push():. 
9890: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52     **.    **   R
98a0: 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a  ewind csr.    **
98b0: 20 20 20 69 66 20 65 6f 66 28 63 73 72 29 20 67     if eof(csr) g
98c0: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b  oto end_of_scan;
98d0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
98e0: 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67  g = 0.    **   g
98f0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b  oto chng_addr_0;
9900: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9910: 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a  next_row:.    **
9920: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20     regChng = 0. 
9930: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
9940: 30 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29  0) != regPrev(0)
9950: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
9960: 72 5f 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  r_0.    **   reg
9970: 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20  Chng = 1.    ** 
9980: 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d 20    if( idx(1) != 
9990: 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f 74  regPrev(1) ) got
99a0: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20  o chng_addr_1.  
99b0: 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a    **   ....    *
99c0: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a  *   regChng = N.
99d0: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68      **   goto ch
99e0: 6e 67 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a  ng_addr_N.    **
99f0: 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64  .    **  chng_ad
9a00: 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72  dr_0:.    **   r
9a10: 65 67 50 72 65 76 28 30 29 20 3d 20 69 64 78 28  egPrev(0) = idx(
9a20: 30 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  0).    **  chng_
9a30: 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20  addr_1:.    **  
9a40: 20 72 65 67 50 72 65 76 28 31 29 20 3d 20 69 64   regPrev(1) = id
9a50: 78 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e  x(1).    **  ...
9a60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9a70: 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 3a  endDistinctTest:
9a80: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77  .    **   regRow
9a90: 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 0a  id = idx(rowid).
9aa0: 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75      **   stat_pu
9ab0: 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72  sh(P, regChng, r
9ac0: 65 67 52 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20  egRowid).    ** 
9ad0: 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a    Next csr.    *
9ae0: 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29  *   if !eof(csr)
9af0: 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a   goto next_row;.
9b00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65      **.    **  e
9b10: 6e 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20  nd_of_scan:.    
9b20: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
9b30: 73 75 72 65 20 74 68 65 72 65 20 61 72 65 20 65  sure there are e
9b40: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c  nough memory cel
9b50: 6c 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ls allocated to 
9b60: 61 63 63 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20  accommodate .   
9b70: 20 2a 2a 20 74 68 65 20 72 65 67 50 72 65 76 20   ** the regPrev 
9b80: 61 72 72 61 79 20 61 6e 64 20 61 20 74 72 61 69  array and a trai
9b90: 6c 69 6e 67 20 72 6f 77 69 64 20 28 74 68 65 20  ling rowid (the 
9ba0: 72 6f 77 69 64 20 73 6c 6f 74 20 69 73 20 72 65  rowid slot is re
9bb0: 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 77 68  quired.    ** wh
9bc0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 61 20 72 65  en building a re
9bd0: 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69  cord to insert i
9be0: 6e 74 6f 20 74 68 65 20 73 61 6d 70 6c 65 20 63  nto the sample c
9bf0: 6f 6c 75 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a  olumn of .    **
9c00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
9c10: 34 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  4 table.  */.   
9c20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9c30: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
9c40: 2c 20 72 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65  , regPrev+nColTe
9c50: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  st);..    /* Ope
9c60: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
9c70: 72 73 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65  rsor on the inde
9c80: 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  x being analyzed
9c90: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
9ca0: 20 69 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68   iDb==sqlite3Sch
9cb0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
9cc0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  Idx->pSchema) );
9cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ce0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
9cf0: 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
9d00: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
9d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9d20: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
9d30: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
9d40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
9d50: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
9d60: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  me));..    /* In
9d70: 76 6f 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e  voke the stat_in
9d80: 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54  it() function. T
9d90: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
9da0: 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  :.    ** .    **
9db0: 20 20 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62      (1) the numb
9dc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9dd0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75   the index inclu
9de0: 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20  ding the rowid. 
9df0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 6f 72     **        (or
9e00: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
9e10: 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 20  OWID table, the 
9e20: 6e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c  number of PK col
9e30: 75 6d 6e 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20  umns),.    **   
9e40: 20 28 32 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (2) the number 
9e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9e60: 65 20 6b 65 79 20 77 69 74 68 6f 75 74 20 74 68  e key without th
9e70: 65 20 72 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a  e rowid/pk.    *
9e80: 2a 20 20 20 20 28 33 29 20 74 68 65 20 6e 75 6d  *    (3) the num
9e90: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
9ea0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
9eb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
9ec0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
9ed0: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  t is only used f
9ee0: 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  or STAT3 and STA
9ef0: 54 34 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  T4.    */.#ifdef
9f00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9f10: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
9f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f30: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
9f40: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
9f50: 74 34 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t4+3);.#endif.  
9f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9f80: 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74  r, nCol, regStat
9f90: 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
9fa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9fb0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
9fc0: 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61  >nKeyCol, regSta
9fd0: 74 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+2);.    sqlit
9fe0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9ff0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
a000: 20 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67   regStat4+1, reg
a010: 53 74 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20  Stat4,.         
a020: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
a030: 72 2a 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63  r*)&statInitFunc
a040: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
a050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a060: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
a070: 73 53 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f  sStat34);..    /
a080: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
a090: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a0a0: 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
a0b0: 20 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20     Rewind csr.  
a0c0: 20 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73    **   if eof(cs
a0d0: 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73  r) goto end_of_s
a0e0: 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65  can;.    **   re
a0f0: 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a  gChng = 0.    **
a100: 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73     goto next_pus
a110: 68 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  h_0;.    **.    
a120: 2a 2f 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e  */.    addrRewin
a130: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
a140: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
a150: 6e 64 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20  nd, iIdxCur);.  
a160: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a180: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a190: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68  nteger, 0, regCh
a1a0: 6e 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78  ng);.    addrNex
a1b0: 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
a1c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a1d0: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54  ;..    if( nColT
a1e0: 65 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  est>0 ){.      i
a1f0: 6e 74 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65  nt endDistinctTe
a200: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
a210: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
a220: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 47  );.      int *aG
a230: 6f 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20 20  otoChng;        
a240: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a250: 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  of jump instruct
a260: 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a 2f  ion addresses */
a270: 0a 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67  .      aGotoChng
a280: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a290: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
a2a0: 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73 74  of(int)*nColTest
a2b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47 6f  );.      if( aGo
a2c0: 74 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e 74  toChng==0 ) cont
a2d0: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a  inue;..      /*.
a2e0: 20 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72        **  next_r
a2f0: 6f 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  ow:.      **   r
a300: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 20  egChng = 0.     
a310: 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29   **   if( idx(0)
a320: 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29   != regPrev(0) )
a330: 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f   goto chng_addr_
a340: 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  0.      **   reg
a350: 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20 2a  Chng = 1.      *
a360: 2a 20 20 20 69 66 28 20 69 64 78 28 31 29 20 21  *   if( idx(1) !
a370: 3d 20 72 65 67 50 72 65 76 28 31 29 20 29 20 67  = regPrev(1) ) g
a380: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a  oto chng_addr_1.
a390: 20 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20        **   .... 
a3a0: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e       **   regChn
a3b0: 67 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20  g = N.      **  
a3c0: 20 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e 63   goto endDistinc
a3d0: 74 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20  tTest.      */. 
a3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
a400: 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e 65  o);.      addrNe
a410: 78 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  xtRow = sqlite3V
a420: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f  );.      if( nCo
a440: 6c 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64 78  lTest==1 && pIdx
a450: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
a460: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
a470: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  dx) ){.        /
a480: 2a 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d 63  * For a single-c
a490: 6f 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e 64  olumn UNIQUE ind
a4a0: 65 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76 65  ex, once we have
a4b0: 20 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c   found a non-NUL
a4c0: 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  L.        ** row
a4d0: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  , we know that a
a4e0: 6c 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c 6c  ll the rest will
a4f0: 20 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73 6f   be distinct, so
a500: 20 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20 2a   skip .        *
a510: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 64 69 73  * subsequent dis
a520: 74 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73 2e  tinctness tests.
a530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
a540: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a550: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
a560: 50 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e 63  Prev, endDistinc
a570: 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tTest);.        
a580: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a5a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65  or(i=0; i<nColTe
a5b0: 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  st; i++){.      
a5c0: 20 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d 20    char *pColl = 
a5d0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f  (char*)sqlite3Lo
a5e0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
a5f0: 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  se, pIdx->azColl
a600: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
a610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a620: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
a630: 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20  , regChng);.    
a640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a650: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a660: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20  mn, iIdxCur, i, 
a670: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
a680: 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d    aGotoChng[i] =
a690: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a6a0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6b0: 50 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20 30  P_Ne, regTemp, 0
a6c0: 2c 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43 6f  , regPrev+i, pCo
a6d0: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
a6e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a700: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
a710: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a720: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
a730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a740: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a750: 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73 74  nteger, nColTest
a760: 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20  , regChng);.    
a770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
a780: 6f 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74  o(v, endDistinct
a790: 54 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20 20  Test);.  .  .   
a7a0: 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20     /*.      **  
a7b0: 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20  chng_addr_0:.   
a7c0: 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28     **   regPrev(
a7d0: 30 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20  0) = idx(0).    
a7e0: 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f    **  chng_addr_
a7f0: 31 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  1:.      **   re
a800: 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31  gPrev(1) = idx(1
a810: 29 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a  ).      **  ....
a820: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
a830: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a840: 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52 6f  re(v, addrNextRo
a850: 77 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  w-1);.      for(
a860: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b  i=0; i<nColTest;
a870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
a880: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a890: 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b  re(v, aGotoChng[
a8a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
a8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a8c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
a8d0: 78 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65 76  xCur, i, regPrev
a8e0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
a8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a900: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
a910: 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a  dDistinctTest);.
a920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a930: 72 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68 6e  ree(db, aGotoChn
a940: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
a950: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67   /*.    **  chng
a960: 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20  _addr_N:.    ** 
a970: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78    regRowid = idx
a980: 28 72 6f 77 69 64 29 20 20 20 20 20 20 20 20 20  (rowid)         
a990: 20 20 20 2f 2f 20 53 54 41 54 33 34 20 6f 6e 6c     // STAT34 onl
a9a0: 79 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f  y.    **   stat_
a9b0: 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c  push(P, regChng,
a9c0: 20 72 65 67 52 6f 77 69 64 29 20 20 2f 2f 20 33   regRowid)  // 3
a9d0: 72 64 20 70 61 72 61 6d 65 74 65 72 20 53 54 41  rd parameter STA
a9e0: 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  T34 only.    ** 
a9f0: 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a    Next csr.    *
aa00: 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29  *   if !eof(csr)
aa10: 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a   goto next_row;.
aa20: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
aa30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
aa40: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 61  3_OR_STAT4.    a
aa50: 73 73 65 72 74 28 20 72 65 67 52 6f 77 69 64 3d  ssert( regRowid=
aa60: 3d 28 72 65 67 53 74 61 74 34 2b 32 29 20 29 3b  =(regStat4+2) );
aa70: 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
aa80: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
aa90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aaa0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
aab0: 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 52  d, iIdxCur, regR
aac0: 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
aad0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
aae0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
aaf0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
ab00: 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->pTable);.     
ab10: 20 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b 65   int j, k, regKe
ab20: 79 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79 20  y;.      regKey 
ab30: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ab40: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50  Range(pParse, pP
ab50: 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
ab60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
ab70: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
ab80: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71  {.        k = sq
ab90: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
aba0: 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69  ex(pIdx, pPk->ai
abb0: 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20  Column[j]);.    
abc0: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d 30      assert( k>=0
abd0: 20 26 26 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && k<pIdx->nCol
abe0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  umn );.        s
abf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac00: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ac10: 49 64 78 43 75 72 2c 20 6b 2c 20 72 65 67 4b 65  IdxCur, k, regKe
ac20: 79 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 56 64  y+j);.        Vd
ac30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ac40: 73 22 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  s", pTab->aCol[p
ac50: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Pk->aiColumn[j]]
ac60: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  .zName));.      
ac70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
ac80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac90: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4b  MakeRecord, regK
aca0: 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ey, pPk->nKeyCol
acb0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
acc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
acd0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
ace0: 65 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e  e, regKey, pPk->
acf0: 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  nKeyCol);.    }.
ad00: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
ad10: 74 28 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67  t( regChng==(reg
ad20: 53 74 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20  Stat4+1) );.    
ad30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad40: 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
ad50: 30 2c 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20  0, 1, regStat4, 
ad60: 72 65 67 54 65 6d 70 2c 0a 20 20 20 20 20 20 20  regTemp,.       
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
ad80: 68 61 72 2a 29 26 73 74 61 74 50 75 73 68 46 75  har*)&statPushFu
ad90: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
ada0: 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
adb0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32  dbeChangeP5(v, 2
adc0: 2b 49 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20  +IsStat34);.    
add0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ade0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
adf0: 64 78 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52  dxCur, addrNextR
ae00: 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ow); VdbeCoverag
ae10: 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  e(v);..    /* Ad
ae20: 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
ae30: 68 65 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20  he stat1 table. 
ae40: 2a 2f 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47  */.    callStatG
ae50: 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20  et(v, regStat4, 
ae60: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20  STAT_GET_STAT1, 
ae70: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 61  regStat1);.    a
ae80: 73 73 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d  ssert( "BBB"[0]=
ae90: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
aea0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
aeb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
aec0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
aed0: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65  abname, 3, regTe
aee0: 6d 70 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20  mp, "BBB", 0);. 
aef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af00: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
af10: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72  wid, iStatCur, r
af20: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
af30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af40: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
af50: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 54 65   iStatCur, regTe
af60: 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  mp, regNewRowid)
af70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
af80: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
af90: 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65  _HOOK.    sqlite
afa0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
afb0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 53 74 61   -1, (char*)pSta
afc0: 74 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23  t1, P4_TABLE);.#
afd0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
afe0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
aff0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b000: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
b010: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
b020: 73 74 61 74 33 20 6f 72 20 73 74 61 74 34 20 74  stat3 or stat4 t
b030: 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
b040: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b050: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
b060: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67   {.      int reg
b070: 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b 0a 20  Eq = regStat1;. 
b080: 20 20 20 20 20 69 6e 74 20 72 65 67 4c 74 20 3d       int regLt =
b090: 20 72 65 67 53 74 61 74 31 2b 31 3b 0a 20 20 20   regStat1+1;.   
b0a0: 20 20 20 69 6e 74 20 72 65 67 44 4c 74 20 3d 20     int regDLt = 
b0b0: 72 65 67 53 74 61 74 31 2b 32 3b 0a 20 20 20 20  regStat1+2;.    
b0c0: 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65 20    int regSample 
b0d0: 3d 20 72 65 67 53 74 61 74 31 2b 33 3b 0a 20 20  = regStat1+3;.  
b0e0: 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 20 3d      int regCol =
b0f0: 20 72 65 67 53 74 61 74 31 2b 34 3b 0a 20 20 20   regStat1+4;.   
b100: 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65     int regSample
b110: 52 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c 20 2b  Rowid = regCol +
b120: 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74   nCol;.      int
b130: 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20 20 20   addrNext;.     
b140: 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 3b   int addrIsNull;
b150: 0a 20 20 20 20 20 20 75 38 20 73 65 65 6b 4f 70  .      u8 seekOp
b160: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
b170: 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ) ? OP_NotExists
b180: 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a   : OP_NotFound;.
b190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
b1a0: 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65  Mem = MAX(pParse
b1b0: 2d 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f 6c 2b 6e  ->nMem, regCol+n
b1c0: 43 6f 6c 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  Col);..      add
b1d0: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
b1e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b1f0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b200: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b210: 2c 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44  , STAT_GET_ROWID
b220: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
b230: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 73 4e  );.      addrIsN
b240: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
b250: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
b260: 4e 75 6c 6c 2c 20 72 65 67 53 61 6d 70 6c 65 52  Null, regSampleR
b270: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62  owid);.      Vdb
b280: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b290: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
b2a0: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
b2b0: 54 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67 45 71  T_GET_NEQ, regEq
b2c0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b2d0: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b2e0: 2c 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 2c 20  , STAT_GET_NLT, 
b2f0: 72 65 67 4c 74 29 3b 0a 20 20 20 20 20 20 63 61  regLt);.      ca
b300: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
b310: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
b320: 4e 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b 0a 20  NDLT, regDLt);. 
b330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b340: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 73 65 65  AddOp4Int(v, see
b350: 6b 4f 70 2c 20 69 54 61 62 43 75 72 2c 20 61 64  kOp, iTabCur, ad
b360: 64 72 4e 65 78 74 2c 20 72 65 67 53 61 6d 70 6c  drNext, regSampl
b370: 65 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  eRowid, 0);.    
b380: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b390: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
b3a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
b3b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b3c0: 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
b3d0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  mn(pParse, pIdx,
b3e0: 20 69 54 61 62 43 75 72 2c 20 30 2c 20 72 65 67   iTabCur, 0, reg
b3f0: 53 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20  Sample);.#else. 
b400: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b410: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b430: 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
b440: 6d 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  mn(pParse, pIdx,
b450: 20 69 54 61 62 43 75 72 2c 20 69 2c 20 72 65 67   iTabCur, i, reg
b460: 43 6f 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  Col+i);.      }.
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b480: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b490: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 43 6f 6c  keRecord, regCol
b4a0: 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 61 6d 70 6c  , nCol, regSampl
b4b0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  e);.#endif.     
b4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4d0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b4e0: 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  ord, regTabname,
b4f0: 20 36 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20   6, regTemp);.  
b500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
b520: 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31  owid, iStatCur+1
b530: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b550: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b560: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31  sert, iStatCur+1
b570: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
b580: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  wRowid);.      s
b590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5a0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20  (v, OP_Goto, 1, 
b5b0: 61 64 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31  addrNext); /* P1
b5c0: 3d 3d 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c  ==1 for end-of-l
b5d0: 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  oop */.      sql
b5e0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b5f0: 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b  (v, addrIsNull);
b600: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
b610: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b620: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
b630: 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ..    /* End of 
b640: 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20  analysis */.    
b650: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b660: 65 72 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e  ere(v, addrRewin
b670: 64 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43  d);.  }...  /* C
b680: 72 65 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73  reate a single s
b690: 71 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72  qlite_stat1 entr
b6a0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c  y containing NUL
b6b0: 4c 20 61 73 20 74 68 65 20 69 6e 64 65 78 0a 20  L as the index. 
b6c0: 20 2a 2a 20 6e 61 6d 65 20 61 6e 64 20 74 68 65   ** name and the
b6d0: 20 72 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68   row count as th
b6e0: 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a  e content..  */.
b6f0: 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 3d 3d    if( pOnlyIdx==
b700: 30 20 26 26 20 6e 65 65 64 54 61 62 6c 65 43 6e  0 && needTableCn
b710: 74 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  t ){.    VdbeCom
b720: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
b730: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
b740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b750: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
b760: 20 69 54 61 62 43 75 72 2c 20 72 65 67 53 74 61   iTabCur, regSta
b770: 74 31 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f  t1);.    jZeroRo
b780: 77 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ws = sqlite3Vdbe
b790: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
b7a0: 6f 74 2c 20 72 65 67 53 74 61 74 31 29 3b 20 56  ot, regStat1); V
b7b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b7c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b7d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b7e0: 2c 20 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29  , 0, regIdxname)
b7f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 22 42  ;.    assert( "B
b800: 42 42 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  BB"[0]==SQLITE_A
b810: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73  FF_TEXT );.    s
b820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b830: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b840: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33  d, regTabname, 3
b850: 2c 20 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22  , regTemp, "BBB"
b860: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b870: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b880: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
b890: 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  tCur, regNewRowi
b8a0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
b8b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b8c0: 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72  Insert, iStatCur
b8d0: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
b8e0: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
b8f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b900: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
b910: 44 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  D);.#ifdef SQLIT
b920: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
b930: 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69  TE_HOOK.    sqli
b940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
b950: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 53  v, -1, (char*)pS
b960: 74 61 74 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b  tat1, P4_TABLE);
b970: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
b980: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b990: 76 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20  v, jZeroRows);. 
b9a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
b9b0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
b9c0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d  will cause the m
b9d0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78  ost recent index
b9e0: 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20   analysis to.** 
b9f0: 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69  be loaded into i
ba00: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
ba10: 6c 65 73 20 77 68 65 72 65 20 69 73 20 63 61 6e  les where is can
ba20: 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61   be used..*/.sta
ba30: 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61  tic void loadAna
ba40: 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70 50 61  lysis(Parse *pPa
ba50: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
ba60: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ba70: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ba80: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
ba90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
baa0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e  Op1(v, OP_LoadAn
bab0: 61 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20 20  alysis, iDb);.  
bac0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
bad0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
bae0: 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ll do an analysi
baf0: 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20 64  s of an entire d
bb00: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
bb10: 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61  c void analyzeDa
bb20: 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
bb30: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
bb40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bb50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63  pParse->db;.  Sc
bb60: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
bb70: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
bb80: 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65  hema;    /* Sche
bb90: 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  ma of database i
bba0: 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  Db */.  HashElem
bbb0: 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74   *k;.  int iStat
bbc0: 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  Cur;.  int iMem;
bbd0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 0a 20 20  .  int iTab;..  
bbe0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
bbf0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
bc00: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53  e, 0, iDb);.  iS
bc10: 74 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d  tatCur = pParse-
bc20: 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d  >nTab;.  pParse-
bc30: 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70  >nTab += 3;.  op
bc40: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
bc50: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
bc60: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d  r, 0, 0);.  iMem
bc70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
bc80: 31 3b 0a 20 20 69 54 61 62 20 3d 20 70 50 61 72  1;.  iTab = pPar
bc90: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 61 73 73 65  se->nTab;.  asse
bca0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
bcb0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
bcc0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28  Db, 0) );.  for(
bcd0: 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
bce0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
bcf0: 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74  ash); k; k=sqlit
bd00: 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
bd10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
bd20: 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
bd30: 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
bd40: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
bd50: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
bd60: 20 69 53 74 61 74 43 75 72 2c 20 69 4d 65 6d 2c   iStatCur, iMem,
bd70: 20 69 54 61 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f   iTab);.  }.  lo
bd80: 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73  adAnalysis(pPars
bd90: 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, iDb);.}../*.*
bda0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bdb0: 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20  that will do an 
bdc0: 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69  analysis of a si
bdd0: 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  ngle table in.**
bde0: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 49 66   a database.  If
bdf0: 20 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e 6f 74   pOnlyIdx is not
be00: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
be10: 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 0a   a single index.
be20: 2a 2a 20 69 6e 20 70 54 61 62 20 74 68 61 74 20  ** in pTab that 
be30: 73 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c 79 7a  should be analyz
be40: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
be50: 69 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28  id analyzeTable(
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
be70: 61 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e 64 65  able *pTab, Inde
be80: 78 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a 20 20  x *pOnlyIdx){.  
be90: 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69  int iDb;.  int i
bea0: 53 74 61 74 43 75 72 3b 0a 0a 20 20 61 73 73 65  StatCur;..  asse
beb0: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
bec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bed0: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
bee0: 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29  exes(pParse->db)
bef0: 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   );.  iDb = sqli
bf00: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
bf10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
bf20: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  b->pSchema);.  s
bf30: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
bf40: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
bf50: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74  , 0, iDb);.  iSt
bf60: 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  atCur = pParse->
bf70: 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
bf80: 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69 66 28  nTab += 3;.  if(
bf90: 20 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20 20 20   pOnlyIdx ){.   
bfa0: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70   openStatTable(p
bfb0: 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61  Parse, iDb, iSta
bfc0: 74 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e  tCur, pOnlyIdx->
bfd0: 7a 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b 0a 20  zName, "idx");. 
bfe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 65 6e   }else{.    open
bff0: 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65  StatTable(pParse
c000: 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c  , iDb, iStatCur,
c010: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74   pTab->zName, "t
c020: 62 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c  bl");.  }.  anal
c030: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72  yzeOneTable(pPar
c040: 73 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c 79 49  se, pTab, pOnlyI
c050: 64 78 2c 20 69 53 74 61 74 43 75 72 2c 70 50 61  dx, iStatCur,pPa
c060: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72  rse->nMem+1,pPar
c070: 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 6c 6f 61  se->nTab);.  loa
c080: 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65  dAnalysis(pParse
c090: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
c0a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c0b0: 6f 72 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  or the ANALYZE c
c0c0: 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 70 61 72  ommand.  The par
c0d0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
c0e0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69  outine.** when i
c0f0: 74 20 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20  t recognizes an 
c100: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
c110: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  .**.**        AN
c120: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
c150: 41 4e 41 4c 59 5a 45 20 20 3c 64 61 74 61 62 61  ANALYZE  <databa
c160: 73 65 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  se>             
c170: 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
c180: 20 20 41 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74    ANALYZE  ?<dat
c190: 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
c1a0: 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20  me>  -- 3.**.** 
c1b0: 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
c1c0: 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
c1d0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
c1e0: 73 65 73 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ses to be analyz
c1f0: 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e  ed..** Form 2 an
c200: 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63  alyzes all indic
c210: 65 73 20 74 68 65 20 73 69 6e 67 6c 65 20 64 61  es the single da
c220: 74 61 62 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a  tabase named..**
c230: 20 46 6f 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73   Form 3 analyzes
c240: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
c250: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c260: 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
c270: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6e 61  .void sqlite3Ana
c280: 6c 79 7a 65 28 50 61 72 73 65 20 2a 70 50 61 72  lyze(Parse *pPar
c290: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
c2a0: 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
c2b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c2c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c2d0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
c2e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  i;.  char *z, *z
c2f0: 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  Db;.  Table *pTa
c300: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c310: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  ;.  Token *pTabl
c320: 65 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  eName;.  Vdbe *v
c330: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
c340: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
c350: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c360: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
c370: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
c380: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
c390: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
c3a0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
c3b0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
c3c0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
c3d0: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
c3e0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
c3f0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
c400: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
c410: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
c420: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
c430: 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b   || pName1==0 );
c440: 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
c450: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20   ){.    /* Form 
c460: 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76 65 72  1:  Analyze ever
c470: 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f  ything */.    fo
c480: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
c490: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c4a0: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
c4b0: 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e  e;  /* Do not an
c4c0: 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50 20 64  alyze the TEMP d
c4d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
c4e0: 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65   analyzeDatabase
c4f0: 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
c500: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
c510: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 28  Name2->n==0 && (
c520: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
c530: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 29  dDb(db, pName1))
c540: 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  >=0 ){.    /* An
c550: 61 6c 79 7a 65 20 74 68 65 20 73 63 68 65 6d 61  alyze the schema
c560: 20 6e 61 6d 65 64 20 61 73 20 74 68 65 20 61 72   named as the ar
c570: 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 61 6e  gument */.    an
c580: 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50  alyzeDatabase(pP
c590: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 65  arse, iDb);.  }e
c5a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d  lse{.    /* Form
c5b0: 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20   3: Analyze the 
c5c0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 6e  table or index n
c5d0: 61 6d 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  amed as an argum
c5e0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ent */.    iDb =
c5f0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
c600: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
c610: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54 61  e1, pName2, &pTa
c620: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  bleName);.    if
c630: 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
c640: 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65 32 2d 3e    zDb = pName2->
c650: 6e 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  n ? db->aDb[iDb]
c660: 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b 0a 20  .zDbSName : 0;. 
c670: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
c680: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c690: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
c6a0: 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20       if( z ){.  
c6b0: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20        if( (pIdx 
c6c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
c6d0: 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21  ex(db, z, zDb))!
c6e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c6f0: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
c700: 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  rse, pIdx->pTabl
c710: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
c720: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61    }else if( (pTa
c730: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
c740: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
c750: 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b  , z, zDb))!=0 ){
c760: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
c770: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
c780: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
c790: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
c7a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
c7b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c7c0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53    }.  if( db->nS
c7d0: 71 6c 45 78 65 63 3d 3d 30 20 26 26 20 28 76 20  qlExec==0 && (v 
c7e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c7f0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
c800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c810: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp0(v, OP_Expi
c820: 72 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  re);.  }.}../*.*
c830: 2a 20 55 73 65 64 20 74 6f 20 70 61 73 73 20 69  * Used to pass i
c840: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
c850: 74 68 65 20 61 6e 61 6c 79 7a 65 72 20 72 65 61  the analyzer rea
c860: 64 65 72 20 74 68 72 6f 75 67 68 20 74 6f 20 74  der through to t
c870: 68 65 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72  he.** callback r
c880: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
c890: 65 66 20 73 74 72 75 63 74 20 61 6e 61 6c 79 73  ef struct analys
c8a0: 69 73 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49  isInfo analysisI
c8b0: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c  nfo;.struct anal
c8c0: 79 73 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c  ysisInfo {.  sql
c8d0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
c8e0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
c8f0: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
c900: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c910: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
c920: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
c930: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  g containing a.*
c940: 2a 20 6c 69 73 74 20 6f 66 20 73 70 61 63 65 20  * list of space 
c950: 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65  separated intege
c960: 72 73 2e 20 52 65 61 64 20 74 68 65 20 66 69 72  rs. Read the fir
c970: 73 74 20 6e 4f 75 74 20 6f 66 20 74 68 65 73 65  st nOut of these
c980: 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 61 72 72   into.** the arr
c990: 61 79 20 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74  ay aOut[]..*/.st
c9a0: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
c9b0: 49 6e 74 41 72 72 61 79 28 0a 20 20 63 68 61 72  IntArray(.  char
c9c0: 20 2a 7a 49 6e 74 41 72 72 61 79 2c 20 20 20 20   *zIntArray,    
c9d0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e     /* String con
c9e0: 74 61 69 6e 69 6e 67 20 69 6e 74 20 61 72 72 61  taining int arra
c9f0: 79 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  y to decode */. 
ca00: 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
ca10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ca20: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 4f  r of slots in aO
ca30: 75 74 5b 5d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ut[] */.  tRowcn
ca40: 74 20 2a 61 4f 75 74 2c 20 20 20 20 20 20 20 20  t *aOut,        
ca50: 20 2f 2a 20 53 74 6f 72 65 20 69 6e 74 65 67 65   /* Store intege
ca60: 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 4c 6f 67  rs here */.  Log
ca70: 45 73 74 20 2a 61 4c 6f 67 2c 20 20 20 20 20 20  Est *aLog,      
ca80: 20 20 20 20 2f 2a 20 4f 72 2c 20 69 66 20 61 4f      /* Or, if aO
ca90: 75 74 3d 3d 30 2c 20 68 65 72 65 20 2a 2f 0a 20  ut==0, here */. 
caa0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 20   Index *pIndex  
cab0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
cac0: 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 66 6f  e extra flags fo
cad0: 72 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  r this index, if
cae0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
caf0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 49 6e 74    char *z = zInt
cb00: 41 72 72 61 79 3b 0a 20 20 69 6e 74 20 63 3b 0a  Array;.  int c;.
cb10: 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63    int i;.  tRowc
cb20: 6e 74 20 76 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt v;..#ifdef SQ
cb30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
cb40: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
cb50: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
cb60: 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
cb70: 7a 21 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  z!=0 );.#endif. 
cb80: 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26 20   for(i=0; *z && 
cb90: 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOut; i++){.  
cba0: 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    v = 0;.    whi
cbb0: 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30  le( (c=z[0])>='0
cbc0: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20  ' && c<='9' ){. 
cbd0: 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20       v = v*10 + 
cbe0: 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a  c - '0';.      z
cbf0: 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ++;.    }.#ifdef
cc00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cc10: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
cc20: 20 20 69 66 28 20 61 4f 75 74 20 29 20 61 4f 75    if( aOut ) aOu
cc30: 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66  t[i] = v;.    if
cc40: 28 20 61 4c 6f 67 20 29 20 61 4c 6f 67 5b 69 5d  ( aLog ) aLog[i]
cc50: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
cc60: 28 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61  (v);.#else.    a
cc70: 73 73 65 72 74 28 20 61 4f 75 74 3d 3d 30 20 29  ssert( aOut==0 )
cc80: 3b 0a 20 20 20 20 55 4e 55 53 45 44 5f 50 41 52  ;.    UNUSED_PAR
cc90: 41 4d 45 54 45 52 28 61 4f 75 74 29 3b 0a 20 20  AMETER(aOut);.  
cca0: 20 20 61 73 73 65 72 74 28 20 61 4c 6f 67 21 3d    assert( aLog!=
ccb0: 30 20 29 3b 0a 20 20 20 20 61 4c 6f 67 5b 69 5d  0 );.    aLog[i]
ccc0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
ccd0: 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  (v);.#endif.    
cce0: 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b  if( *z==' ' ) z+
ccf0: 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  +;.  }.#ifndef S
cd00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
cd10: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61 73  T3_OR_STAT4.  as
cd20: 73 65 72 74 28 20 70 49 6e 64 65 78 21 3d 30 20  sert( pIndex!=0 
cd30: 29 3b 20 7b 0a 23 65 6c 73 65 0a 20 20 69 66 28  ); {.#else.  if(
cd40: 20 70 49 6e 64 65 78 20 29 7b 0a 23 65 6e 64 69   pIndex ){.#endi
cd50: 66 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55  f.    pIndex->bU
cd60: 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  nordered = 0;.  
cd70: 20 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70    pIndex->noSkip
cd80: 53 63 61 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68  Scan = 0;.    wh
cd90: 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  ile( z[0] ){.   
cda0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
cdb0: 74 72 67 6c 6f 62 28 22 75 6e 6f 72 64 65 72 65  trglob("unordere
cdc0: 64 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  d*", z)==0 ){.  
cdd0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55        pIndex->bU
cde0: 6e 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  nordered = 1;.  
cdf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
ce00: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73  lite3_strglob("s
ce10: 7a 3d 5b 30 2d 39 5d 2a 22 2c 20 7a 29 3d 3d 30  z=[0-9]*", z)==0
ce20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
ce30: 65 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  ex->szIdxRow = s
ce40: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 71 6c  qlite3LogEst(sql
ce50: 69 74 65 33 41 74 6f 69 28 7a 2b 33 29 29 3b 0a  ite3Atoi(z+3));.
ce60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ce70: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
ce80: 22 6e 6f 73 6b 69 70 73 63 61 6e 2a 22 2c 20 7a  "noskipscan*", z
ce90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cea0: 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53 63  pIndex->noSkipSc
ceb0: 61 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  an = 1;.      }.
cec0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ced0: 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20 20  ABLE_COSTMULT.  
cee0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 71 6c      else if( sql
cef0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 63 6f  ite3_strglob("co
cf00: 73 74 6d 75 6c 74 3d 5b 30 2d 39 5d 2a 22 2c 7a  stmult=[0-9]*",z
cf10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cf20: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
cf30: 63 6f 73 74 4d 75 6c 74 20 3d 20 73 71 6c 69 74  costMult = sqlit
cf40: 65 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65 33  e3LogEst(sqlite3
cf50: 41 74 6f 69 28 7a 2b 39 29 29 3b 0a 20 20 20 20  Atoi(z+9));.    
cf60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
cf70: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30 20   while( z[0]!=0 
cf80: 26 26 20 7a 5b 30 5d 21 3d 27 20 27 20 29 20 7a  && z[0]!=' ' ) z
cf90: 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
cfa0: 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b   z[0]==' ' ) z++
cfb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
cfc0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
cfd0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ck is invoked on
cfe0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ce for each inde
cff0: 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74  x when reading t
d000: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  he.** sqlite_sta
d010: 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  t1 table.  .**.*
d020: 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20  *     argv[0] = 
d030: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
d040: 65 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d  e.**     argv[1]
d050: 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69   = name of the i
d060: 6e 64 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e  ndex (might be N
d070: 55 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76  ULL).**     argv
d080: 5b 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66  [2] = results of
d090: 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69   analysis - on i
d0a0: 6e 74 65 67 65 72 20 66 6f 72 20 65 61 63 68 20  nteger for each 
d0b0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74  column.**.** Ent
d0c0: 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 61  ries for which a
d0d0: 72 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d  rgv[1]==NULL sim
d0e0: 70 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e  ply record the n
d0f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
d100: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
d110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
d120: 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64  lysisLoader(void
d130: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67   *pData, int arg
d140: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  c, char **argv, 
d150: 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b  char **NotUsed){
d160: 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20  .  analysisInfo 
d170: 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73  *pInfo = (analys
d180: 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20  isInfo*)pData;. 
d190: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
d1a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
d1b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d1c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
d1d0: 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==3 );.  UNUSED
d1e0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
d1f0: 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69  sed, argc);..  i
d200: 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72  f( argv==0 || ar
d210: 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76  gv[0]==0 || argv
d220: 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  [2]==0 ){.    re
d230: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
d240: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
d250: 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e 64  ndTable(pInfo->d
d260: 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66  b, argv[0], pInf
d270: 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  o->zDatabase);. 
d280: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
d290: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d2a0: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31    }.  if( argv[1
d2b0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  ]==0 ){.    pInd
d2c0: 65 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ex = 0;.  }else 
d2d0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
d2e0: 63 6d 70 28 61 72 67 76 5b 30 5d 2c 61 72 67 76  cmp(argv[0],argv
d2f0: 5b 31 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  [1])==0 ){.    p
d300: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 50  Index = sqlite3P
d310: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
d320: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Table);.  }else{
d330: 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71  .    pIndex = sq
d340: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 70  lite3FindIndex(p
d350: 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 31  Info->db, argv[1
d360: 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62  ], pInfo->zDatab
d370: 61 73 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  ase);.  }.  z = 
d380: 61 72 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28 20  argv[2];..  if( 
d390: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 74 52  pIndex ){.    tR
d3a0: 6f 77 63 6e 74 20 2a 61 69 52 6f 77 45 73 74 20  owcnt *aiRowEst 
d3b0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  = 0;.    int nCo
d3c0: 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
d3d0: 43 6f 6c 2b 31 3b 0a 23 69 66 64 65 66 20 53 51  Col+1;.#ifdef SQ
d3e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
d3f0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 2f  3_OR_STAT4.    /
d400: 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  * Index.aiRowEst
d410: 20 6d 61 79 20 61 6c 72 65 61 64 79 20 62 65 20   may already be 
d420: 73 65 74 20 68 65 72 65 20 69 66 20 74 68 65 72  set here if ther
d430: 65 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 20  e are duplicate 
d440: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 73  .    ** sqlite_s
d450: 74 61 74 31 20 65 6e 74 72 69 65 73 20 66 6f 72  tat1 entries for
d460: 20 74 68 69 73 20 69 6e 64 65 78 2e 20 49 6e 20   this index. In 
d470: 74 68 61 74 20 63 61 73 65 20 6a 75 73 74 20 63  that case just c
d480: 6c 6f 62 62 65 72 0a 20 20 20 20 2a 2a 20 74 68  lobber.    ** th
d490: 65 20 6f 6c 64 20 64 61 74 61 20 77 69 74 68 20  e old data with 
d4a0: 74 68 65 20 6e 65 77 20 69 6e 73 74 65 61 64 20  the new instead 
d4b0: 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
d4c0: 6e 65 77 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  new array.  */. 
d4d0: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
d4e0: 69 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  iRowEst==0 ){.  
d4f0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f      pIndex->aiRo
d500: 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  wEst = (tRowcnt*
d510: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
d520: 72 6f 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  ro(sizeof(tRowcn
d530: 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  t) * nCol);.    
d540: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69    if( pIndex->ai
d550: 52 6f 77 45 73 74 3d 3d 30 20 29 20 73 71 6c 69  RowEst==0 ) sqli
d560: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 49 6e 66  te3OomFault(pInf
d570: 6f 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  o->db);.    }.  
d580: 20 20 61 69 52 6f 77 45 73 74 20 3d 20 70 49 6e    aiRowEst = pIn
d590: 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 23  dex->aiRowEst;.#
d5a0: 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64 65 78  endif.    pIndex
d5b0: 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d 20 30  ->bUnordered = 0
d5c0: 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  ;.    decodeIntA
d5d0: 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20 6e  rray((char*)z, n
d5e0: 43 6f 6c 2c 20 61 69 52 6f 77 45 73 74 2c 20 70  Col, aiRowEst, p
d5f0: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
d600: 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  st, pIndex);.   
d610: 20 70 49 6e 64 65 78 2d 3e 68 61 73 53 74 61 74   pIndex->hasStat
d620: 31 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  1 = 1;.    if( p
d630: 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57  Index->pPartIdxW
d640: 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
d650: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
d660: 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  Est = pIndex->ai
d670: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
d680: 20 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46      pTable->tabF
d690: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53 74  lags |= TF_HasSt
d6a0: 61 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  at1;.    }.  }el
d6b0: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 66 61  se{.    Index fa
d6c0: 6b 65 49 64 78 3b 0a 20 20 20 20 66 61 6b 65 49  keIdx;.    fakeI
d6d0: 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54  dx.szIdxRow = pT
d6e0: 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  able->szTabRow;.
d6f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d700: 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20 20  ABLE_COSTMULT.  
d710: 20 20 66 61 6b 65 49 64 78 2e 70 54 61 62 6c 65    fakeIdx.pTable
d720: 20 3d 20 70 54 61 62 6c 65 3b 0a 23 65 6e 64 69   = pTable;.#endi
d730: 66 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  f.    decodeIntA
d740: 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20 31  rray((char*)z, 1
d750: 2c 20 30 2c 20 26 70 54 61 62 6c 65 2d 3e 6e 52  , 0, &pTable->nR
d760: 6f 77 4c 6f 67 45 73 74 2c 20 26 66 61 6b 65 49  owLogEst, &fakeI
d770: 64 78 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  dx);.    pTable-
d780: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 66 61 6b 65  >szTabRow = fake
d790: 49 64 78 2e 73 7a 49 64 78 52 6f 77 3b 0a 20 20  Idx.szIdxRow;.  
d7a0: 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61    pTable->tabFla
d7b0: 67 73 20 7c 3d 20 54 46 5f 48 61 73 53 74 61 74  gs |= TF_HasStat
d7c0: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
d7d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
d7e0: 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c  the Index.aSampl
d7f0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  e variable is no
d800: 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74  t NULL, delete t
d810: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
d820: 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63 6f  ay.** and its co
d830: 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntents..*/.void 
d840: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64  sqlite3DeleteInd
d850: 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65  exSamples(sqlite
d860: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
d870: 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  dx){.#ifdef SQLI
d880: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d890: 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
d8a0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a  Idx->aSample ){.
d8b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
d8c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
d8d0: 6e 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20  nSample; j++){. 
d8e0: 20 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65       IndexSample
d8f0: 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61 53 61   *p = &pIdx->aSa
d900: 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  mple[j];.      s
d910: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d920: 20 70 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a 20 20   p->p);.    }.  
d930: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d940: 64 62 2c 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  db, pIdx->aSampl
d950: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  e);.  }.  if( db
d960: 20 26 26 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   && db->pnBytesF
d970: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  reed==0 ){.    p
d980: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 30  Idx->nSample = 0
d990: 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d  ;.    pIdx->aSam
d9a0: 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c  ple = 0;.  }.#el
d9b0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
d9c0: 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
d9d0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49  SED_PARAMETER(pI
d9e0: 64 78 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dx);.#endif /* S
d9f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
da00: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 7d  T3_OR_STAT4 */.}
da10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
da20: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
da30: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  STAT4./*.** Popu
da40: 6c 61 74 65 20 74 68 65 20 70 49 64 78 2d 3e 61  late the pIdx->a
da50: 41 76 67 45 71 5b 5d 20 61 72 72 61 79 20 62 61  AvgEq[] array ba
da60: 73 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 70 6c  sed on the sampl
da70: 65 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  es currently.** 
da80: 73 74 6f 72 65 64 20 69 6e 20 70 49 64 78 2d 3e  stored in pIdx->
da90: 61 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73  aSample[]. .*/.s
daa0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 41  tatic void initA
dab0: 76 67 45 71 28 49 6e 64 65 78 20 2a 70 49 64 78  vgEq(Index *pIdx
dac0: 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b  ){.  if( pIdx ){
dad0: 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  .    IndexSample
dae0: 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78   *aSample = pIdx
daf0: 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20 49  ->aSample;.    I
db00: 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 46 69 6e  ndexSample *pFin
db10: 61 6c 20 3d 20 26 61 53 61 6d 70 6c 65 5b 70 49  al = &aSample[pI
db20: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a  dx->nSample-1];.
db30: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
db40: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 0a    int nCol = 1;.
db50: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 53      if( pIdx->nS
db60: 61 6d 70 6c 65 43 6f 6c 3e 31 20 29 7b 0a 20 20  ampleCol>1 ){.  
db70: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
db80: 73 20 73 74 61 74 34 20 64 61 74 61 2c 20 74 68  s stat4 data, th
db90: 65 6e 20 63 61 6c 63 75 6c 61 74 65 20 61 41 76  en calculate aAv
dba0: 67 45 71 5b 5d 20 76 61 6c 75 65 73 20 66 6f 72  gEq[] values for
dbb0: 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 73 61   all.      ** sa
dbc0: 6d 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 65 78 63  mple columns exc
dbd0: 65 70 74 20 74 68 65 20 6c 61 73 74 2e 20 54 68  ept the last. Th
dbe0: 65 20 6c 61 73 74 20 69 73 20 61 6c 77 61 79 73  e last is always
dbf0: 20 73 65 74 20 74 6f 20 31 2c 20 61 73 0a 20 20   set to 1, as.  
dc00: 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 68 65 20      ** once the 
dc10: 74 72 61 69 6c 69 6e 67 20 50 4b 20 66 69 65 6c  trailing PK fiel
dc20: 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ds are considere
dc30: 64 20 61 6c 6c 20 69 6e 64 65 78 20 6b 65 79 73  d all index keys
dc40: 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 75 6e   are.      ** un
dc50: 69 71 75 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ique.  */.      
dc60: 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61  nCol = pIdx->nSa
dc70: 6d 70 6c 65 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  mpleCol-1;.     
dc80: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 43   pIdx->aAvgEq[nC
dc90: 6f 6c 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ol] = 1;.    }. 
dca0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
dcb0: 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  Col<nCol; iCol++
dcc0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 61  ){.      int nSa
dcd0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
dce0: 6d 70 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  mple;.      int 
dcf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dd00: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
dd10: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
dd20: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20   samples */.    
dd30: 20 20 74 52 6f 77 63 6e 74 20 73 75 6d 45 71 20    tRowcnt sumEq 
dd40: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  = 0;        /* S
dd50: 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20 76 61  um of the nEq va
dd60: 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52  lues */.      tR
dd70: 6f 77 63 6e 74 20 61 76 67 45 71 20 3d 20 30 3b  owcnt avgEq = 0;
dd80: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  .      tRowcnt n
dd90: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
dda0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
ddb0: 77 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  ws in index */. 
ddc0: 20 20 20 20 20 69 36 34 20 6e 53 75 6d 31 30 30       i64 nSum100
ddd0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
dde0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
ddf0: 73 20 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 74  s contributing t
de00: 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20 20 20 20  o sumEq */.     
de10: 20 69 36 34 20 6e 44 69 73 74 31 30 30 3b 20 20   i64 nDist100;  
de20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
de30: 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
de40: 20 76 61 6c 75 65 73 20 69 6e 20 69 6e 64 65 78   values in index
de50: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
de60: 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 7c  pIdx->aiRowEst |
de70: 7c 20 69 43 6f 6c 3e 3d 70 49 64 78 2d 3e 6e 4b  | iCol>=pIdx->nK
de80: 65 79 43 6f 6c 20 7c 7c 20 70 49 64 78 2d 3e 61  eyCol || pIdx->a
de90: 69 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31 5d 3d  iRowEst[iCol+1]=
dea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 52  =0 ){.        nR
deb0: 6f 77 20 3d 20 70 46 69 6e 61 6c 2d 3e 61 6e 4c  ow = pFinal->anL
dec0: 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  t[iCol];.       
ded0: 20 6e 44 69 73 74 31 30 30 20 3d 20 28 69 36 34   nDist100 = (i64
dee0: 29 31 30 30 20 2a 20 70 46 69 6e 61 6c 2d 3e 61  )100 * pFinal->a
def0: 6e 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  nDLt[iCol];.    
df00: 20 20 20 20 6e 53 61 6d 70 6c 65 2d 2d 3b 0a 20      nSample--;. 
df10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df20: 20 20 20 20 6e 52 6f 77 20 3d 20 70 49 64 78 2d      nRow = pIdx-
df30: 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
df40: 20 20 20 20 20 20 6e 44 69 73 74 31 30 30 20 3d        nDist100 =
df50: 20 28 28 69 36 34 29 31 30 30 20 2a 20 70 49 64   ((i64)100 * pId
df60: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 20  x->aiRowEst[0]) 
df70: 2f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  / pIdx->aiRowEst
df80: 5b 69 43 6f 6c 2b 31 5d 3b 0a 20 20 20 20 20 20  [iCol+1];.      
df90: 7d 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 52  }.      pIdx->nR
dfa0: 6f 77 45 73 74 30 20 3d 20 6e 52 6f 77 3b 0a 0a  owEst0 = nRow;..
dfb0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 53 75        /* Set nSu
dfc0: 6d 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  m to the number 
dfd0: 6f 66 20 64 69 73 74 69 6e 63 74 20 28 69 43 6f  of distinct (iCo
dfe0: 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
dff0: 78 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a  xes that.      *
e000: 2a 20 6f 63 63 75 72 20 69 6e 20 74 68 65 20 73  * occur in the s
e010: 74 61 74 34 20 74 61 62 6c 65 20 66 6f 72 20 74  tat4 table for t
e020: 68 69 73 20 69 6e 64 65 78 2e 20 53 65 74 20 73  his index. Set s
e030: 75 6d 45 71 20 74 6f 20 74 68 65 20 73 75 6d 20  umEq to the sum 
e040: 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  of .      ** the
e050: 20 6e 45 71 20 76 61 6c 75 65 73 20 66 6f 72 20   nEq values for 
e060: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f 72 20  column iCol for 
e070: 74 68 65 20 73 61 6d 65 20 73 65 74 20 28 61 64  the same set (ad
e080: 64 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 0a  ding the value .
e090: 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 6e        ** only on
e0a0: 63 65 20 77 68 65 72 65 20 74 68 65 72 65 20 65  ce where there e
e0b0: 78 69 73 74 20 64 75 70 6c 69 63 61 74 65 20 70  xist duplicate p
e0c0: 72 65 66 69 78 65 73 29 2e 20 20 2a 2f 0a 20 20  refixes).  */.  
e0d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e0e0: 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
e0f0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 70 49        if( i==(pI
e100: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 29 0a 20  dx->nSample-1). 
e110: 20 20 20 20 20 20 20 20 7c 7c 20 61 53 61 6d 70          || aSamp
e120: 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c  le[i].anDLt[iCol
e130: 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e  ]!=aSample[i+1].
e140: 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 0a 20 20 20  anDLt[iCol] .   
e150: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e160: 20 20 73 75 6d 45 71 20 2b 3d 20 61 53 61 6d 70    sumEq += aSamp
e170: 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  le[i].anEq[iCol]
e180: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 75 6d  ;.          nSum
e190: 31 30 30 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20  100 += 100;.    
e1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e1b0: 20 20 20 20 20 69 66 28 20 6e 44 69 73 74 31 30       if( nDist10
e1c0: 30 3e 6e 53 75 6d 31 30 30 20 26 26 20 73 75 6d  0>nSum100 && sum
e1d0: 45 71 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20  Eq<nRow ){.     
e1e0: 20 20 20 61 76 67 45 71 20 3d 20 28 28 69 36 34     avgEq = ((i64
e1f0: 29 31 30 30 20 2a 20 28 6e 52 6f 77 20 2d 20 73  )100 * (nRow - s
e200: 75 6d 45 71 29 29 2f 28 6e 44 69 73 74 31 30 30  umEq))/(nDist100
e210: 20 2d 20 6e 53 75 6d 31 30 30 29 3b 0a 20 20 20   - nSum100);.   
e220: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e230: 76 67 45 71 3d 3d 30 20 29 20 61 76 67 45 71 20  vgEq==0 ) avgEq 
e240: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = 1;.      pIdx-
e250: 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3d 20  >aAvgEq[iCol] = 
e260: 61 76 67 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  avgEq;.    }.  }
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75  .}../*.** Look u
e280: 70 20 61 6e 20 69 6e 64 65 78 20 62 79 20 6e 61  p an index by na
e290: 6d 65 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  me.  Or, if the 
e2a0: 6e 61 6d 65 20 6f 66 20 61 20 57 49 54 48 4f 55  name of a WITHOU
e2b0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 2a 2a  T ROWID table.**
e2c0: 20 69 73 20 73 75 70 70 6c 69 65 64 20 69 6e 73   is supplied ins
e2d0: 74 65 61 64 2c 20 66 69 6e 64 20 74 68 65 20 50  tead, find the P
e2e0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e2f0: 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
e300: 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 64 65 78  .*/.static Index
e310: 20 2a 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69   *findIndexOrPri
e320: 6d 61 72 79 4b 65 79 28 0a 20 20 73 71 6c 69 74  maryKey(.  sqlit
e330: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e340: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63  char *zName,.  c
e350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 0a 29  onst char *zDb.)
e360: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  {.  Index *pIdx 
e370: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
e380: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  ex(db, zName, zD
e390: 62 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  b);.  if( pIdx==
e3a0: 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
e3b0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
e3c0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
e3d0: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
e3e0: 20 70 54 61 62 20 26 26 20 21 48 61 73 52 6f 77   pTab && !HasRow
e3f0: 69 64 28 70 54 61 62 29 20 29 20 70 49 64 78 20  id(pTab) ) pIdx 
e400: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e410: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64    }.  return pId
e430: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  x;.}../*.** Load
e440: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f   the content fro
e450: 6d 20 65 69 74 68 65 72 20 74 68 65 20 73 71 6c  m either the sql
e460: 69 74 65 5f 73 74 61 74 34 20 6f 72 20 73 71 6c  ite_stat4 or sql
e470: 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 20  ite_stat3 table 
e480: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 6c  .** into the rel
e490: 65 76 61 6e 74 20 49 6e 64 65 78 2e 61 53 61 6d  evant Index.aSam
e4a0: 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a  ple[] arrays..**
e4b0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 7a 53  .** Arguments zS
e4c0: 71 6c 31 20 61 6e 64 20 7a 53 71 6c 32 20 6d 75  ql1 and zSql2 mu
e4d0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 53 51 4c 20  st point to SQL 
e4e0: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
e4f0: 72 65 74 75 72 6e 0a 2a 2a 20 64 61 74 61 20 65  return.** data e
e500: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
e510: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 73 74 61 74   following (stat
e520: 65 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65  ements are diffe
e530: 72 65 6e 74 20 66 6f 72 20 73 74 61 74 33 2c 0a  rent for stat3,.
e540: 2a 2a 20 73 65 65 20 74 68 65 20 63 61 6c 6c 65  ** see the calle
e550: 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
e560: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 29 3a  on for details):
e570: 0a 2a 2a 0a 2a 2a 20 20 20 20 7a 53 71 6c 31 3a  .**.**    zSql1:
e580: 20 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e   SELECT idx,coun
e590: 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c  t(*) FROM %Q.sql
e5a0: 69 74 65 5f 73 74 61 74 34 20 47 52 4f 55 50 20  ite_stat4 GROUP 
e5b0: 42 59 20 69 64 78 0a 2a 2a 20 20 20 20 7a 53 71  BY idx.**    zSq
e5c0: 6c 32 3a 20 53 45 4c 45 43 54 20 69 64 78 2c 6e  l2: SELECT idx,n
e5d0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
e5e0: 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  le FROM %Q.sqlit
e5f0: 65 5f 73 74 61 74 34 0a 2a 2a 0a 2a 2a 20 77 68  e_stat4.**.** wh
e600: 65 72 65 20 25 51 20 69 73 20 72 65 70 6c 61 63  ere %Q is replac
e610: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
e620: 62 61 73 65 20 6e 61 6d 65 20 62 65 66 6f 72 65  base name before
e630: 20 74 68 65 20 53 51 4c 20 69 73 20 65 78 65 63   the SQL is exec
e640: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
e650: 69 6e 74 20 6c 6f 61 64 53 74 61 74 54 62 6c 28  int loadStatTbl(
e660: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
e690: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 53 74  dle */.  int bSt
e6a0: 61 74 33 2c 20 20 20 20 20 20 20 20 20 20 20 20  at3,            
e6b0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
e6c0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 72   single column r
e6d0: 65 63 6f 72 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20  ecords only */. 
e6e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
e6f0: 6c 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  l1,            /
e700: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
e710: 31 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  1 (see above) */
e720: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e730: 53 71 6c 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sql2,           
e740: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
e750: 74 20 32 20 28 73 65 65 20 61 62 6f 76 65 29 20  t 2 (see above) 
e760: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e770: 2a 7a 44 62 20 20 20 20 20 20 20 20 20 20 20 20  *zDb            
e780: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
e790: 61 6d 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e 22  ame (e.g. "main"
e7a0: 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
e7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e7d0: 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62  t codes from sub
e7e0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71  routines */.  sq
e7f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e800: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41  t = 0;      /* A
e810: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
e820: 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a 20 20 63  being run */.  c
e830: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e850: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
e860: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 49  statement */.  I
e870: 6e 64 65 78 20 2a 70 50 72 65 76 49 64 78 20 3d  ndex *pPrevIdx =
e880: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
e890: 50 72 65 76 69 6f 75 73 20 69 6e 64 65 78 20 69  Previous index i
e8a0: 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
e8b0: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 53 61  IndexSample *pSa
e8c0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  mple;         /*
e8d0: 20 41 20 73 6c 6f 74 20 69 6e 20 70 49 64 78 2d   A slot in pIdx-
e8e0: 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20  >aSample[] */.. 
e8f0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
e900: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
e910: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
e920: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  te3MPrintf(db, z
e930: 53 71 6c 31 2c 20 7a 44 62 29 3b 0a 20 20 69 66  Sql1, zDb);.  if
e940: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72  ( !zSql ){.    r
e950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e960: 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
e970: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
e980: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  are(db, zSql, -1
e990: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
e9a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e9b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  , zSql);.  if( r
e9c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
e9d0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
e9e0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
e9f0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
ea00: 69 6e 74 20 6e 49 64 78 43 6f 6c 20 3d 20 31 3b  int nIdxCol = 1;
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
ea30: 6e 73 20 69 6e 20 73 74 61 74 34 20 72 65 63 6f  ns in stat4 reco
ea40: 72 64 73 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72  rds */..    char
ea50: 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49   *zIndex;   /* I
ea60: 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ndex name */.   
ea70: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
ea80: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
ea90: 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  he index object 
eaa0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d 70  */.    int nSamp
eab0: 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  le;    /* Number
eac0: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20   of samples */. 
ead0: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
eae0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
eaf0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f  pace required */
eb00: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
eb10: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
eb20: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
eb30: 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a  */.    tRowcnt *
eb40: 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49 6e  pSpace;..    zIn
eb50: 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71  dex = (char *)sq
eb60: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
eb70: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
eb80: 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29   if( zIndex==0 )
eb90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
eba0: 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
ebb0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
ebc0: 74 2c 20 31 29 3b 0a 20 20 20 20 70 49 64 78 20  t, 1);.    pIdx 
ebd0: 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69  = findIndexOrPri
ebe0: 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e 64  maryKey(db, zInd
ebf0: 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 61 73  ex, zDb);.    as
ec00: 73 65 72 74 28 20 70 49 64 78 3d 3d 30 20 7c 7c  sert( pIdx==0 ||
ec10: 20 62 53 74 61 74 33 20 7c 7c 20 70 49 64 78 2d   bStat3 || pIdx-
ec20: 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20  >nSample==0 );. 
ec30: 20 20 20 2f 2a 20 49 6e 64 65 78 2e 6e 53 61 6d     /* Index.nSam
ec40: 70 6c 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ple is non-zero 
ec50: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66  at this point if
ec60: 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64   data has alread
ec70: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f  y been.    ** lo
ec80: 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  aded from the st
ec90: 61 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68  at4 table. In th
eca0: 69 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73  is case ignore s
ecb0: 74 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20  tat3 data.  */. 
ecc0: 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 7c     if( pIdx==0 |
ecd0: 7c 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  | pIdx->nSample 
ece0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ecf0: 69 66 28 20 62 53 74 61 74 33 3d 3d 30 20 29 7b  if( bStat3==0 ){
ed00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
ed10: 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
ed20: 54 61 62 6c 65 29 20 7c 7c 20 70 49 64 78 2d 3e  Table) || pIdx->
ed30: 6e 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 6e  nColumn==pIdx->n
ed40: 4b 65 79 43 6f 6c 2b 31 20 29 3b 0a 20 20 20 20  KeyCol+1 );.    
ed50: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
ed60: 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 26 26  pIdx->pTable) &&
ed70: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
ed80: 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20  ex(pIdx) ){.    
ed90: 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49      nIdxCol = pI
eda0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
edb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edc0: 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78    nIdxCol = pIdx
edd0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
ede0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64   }.    }.    pId
edf0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 3d 20  x->nSampleCol = 
ee00: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 6e 42 79  nIdxCol;.    nBy
ee10: 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65  te = sizeof(Inde
ee20: 78 53 61 6d 70 6c 65 29 20 2a 20 6e 53 61 6d 70  xSample) * nSamp
ee30: 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d  le;.    nByte +=
ee40: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
ee50: 20 2a 20 6e 49 64 78 43 6f 6c 20 2a 20 33 20 2a   * nIdxCol * 3 *
ee60: 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42   nSample;.    nB
ee70: 79 74 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 20 2a  yte += nIdxCol *
ee80: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
ee90: 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66  ;     /* Space f
eea0: 6f 72 20 49 6e 64 65 78 2e 61 41 76 67 45 71 5b  or Index.aAvgEq[
eeb0: 5d 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 2d 3e  ] */..    pIdx->
eec0: 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65  aSample = sqlite
eed0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
eee0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
eef0: 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3d  ( pIdx->aSample=
ef00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ef10: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
ef20: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
ef30: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
ef40: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
ef50: 53 70 61 63 65 20 3d 20 28 74 52 6f 77 63 6e 74  Space = (tRowcnt
ef60: 2a 29 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  *)&pIdx->aSample
ef70: 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 70  [nSample];.    p
ef80: 49 64 78 2d 3e 61 41 76 67 45 71 20 3d 20 70 53  Idx->aAvgEq = pS
ef90: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
efa0: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 66 6f 72  nIdxCol;.    for
efb0: 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b  (i=0; i<nSample;
efc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
efd0: 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e  x->aSample[i].an
efe0: 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70  Eq = pSpace; pSp
eff0: 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a  ace += nIdxCol;.
f000: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d        pIdx->aSam
f010: 70 6c 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70 53  ple[i].anLt = pS
f020: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
f030: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70  nIdxCol;.      p
f040: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  Idx->aSample[i].
f050: 61 6e 44 4c 74 20 3d 20 70 53 70 61 63 65 3b 20  anDLt = pSpace; 
f060: 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f  pSpace += nIdxCo
f070: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  l;.    }.    ass
f080: 65 72 74 28 20 28 28 75 38 2a 29 70 53 70 61 63  ert( ((u8*)pSpac
f090: 65 29 2d 6e 42 79 74 65 3d 3d 28 75 38 2a 29 28  e)-nByte==(u8*)(
f0a0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 20 29  pIdx->aSample) )
f0b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f0c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
f0d0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tmt);.  if( rc )
f0e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a   return rc;..  z
f0f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
f100: 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 32 2c 20  intf(db, zSql2, 
f110: 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53 71  zDb);.  if( !zSq
f120: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
f130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f140: 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  T;.  }.  rc = sq
f150: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
f160: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
f170: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
f180: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
f190: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
f1a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
f1b0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
f1c0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
f1d0: 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  OW ){.    char *
f1e0: 7a 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  zIndex;         
f1f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f200: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
f210: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
f220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
f230: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64  inter to the ind
f240: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ex object */.   
f250: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20 20   int nCol = 1;  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f270: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
f280: 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  mns in index */.
f290: 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63  .    zIndex = (c
f2a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
f2b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
f2c0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e   0);.    if( zIn
f2d0: 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dex==0 ) continu
f2e0: 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  e;.    pIdx = fi
f2f0: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
f300: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
f310: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
f320: 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dx==0 ) continue
f330: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6e 65  ;.    /* This ne
f340: 78 74 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  xt condition is 
f350: 74 72 75 65 20 69 66 20 64 61 74 61 20 68 61 73  true if data has
f360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f   already been lo
f370: 61 64 65 64 20 66 72 6f 6d 20 0a 20 20 20 20 2a  aded from .    *
f380: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * the sqlite_sta
f390: 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69  t4 table. In thi
f3a0: 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74  s case ignore st
f3b0: 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  at3 data.  */.  
f3c0: 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e    nCol = pIdx->n
f3d0: 53 61 6d 70 6c 65 43 6f 6c 3b 0a 20 20 20 20 69  SampleCol;.    i
f3e0: 66 28 20 62 53 74 61 74 33 20 26 26 20 6e 43 6f  f( bStat3 && nCo
f3f0: 6c 3e 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  l>1 ) continue;.
f400: 20 20 20 20 69 66 28 20 70 49 64 78 21 3d 70 50      if( pIdx!=pP
f410: 72 65 76 49 64 78 20 29 7b 0a 20 20 20 20 20 20  revIdx ){.      
f420: 69 6e 69 74 41 76 67 45 71 28 70 50 72 65 76 49  initAvgEq(pPrevI
f430: 64 78 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  dx);.      pPrev
f440: 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
f450: 7d 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  }.    pSample = 
f460: 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 70  &pIdx->aSample[p
f470: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  Idx->nSample];. 
f480: 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61     decodeIntArra
f490: 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  y((char*)sqlite3
f4a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
f4b0: 6d 74 2c 31 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70  mt,1),nCol,pSamp
f4c0: 6c 65 2d 3e 61 6e 45 71 2c 30 2c 30 29 3b 0a 20  le->anEq,0,0);. 
f4d0: 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61     decodeIntArra
f4e0: 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  y((char*)sqlite3
f4f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
f500: 6d 74 2c 32 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70  mt,2),nCol,pSamp
f510: 6c 65 2d 3e 61 6e 4c 74 2c 30 2c 30 29 3b 0a 20  le->anLt,0,0);. 
f520: 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61     decodeIntArra
f530: 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  y((char*)sqlite3
f540: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
f550: 6d 74 2c 33 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70  mt,3),nCol,pSamp
f560: 6c 65 2d 3e 61 6e 44 4c 74 2c 30 2c 30 29 3b 0a  le->anDLt,0,0);.
f570: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 20 63  .    /* Take a c
f580: 6f 70 79 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  opy of the sampl
f590: 65 2e 20 41 64 64 20 74 77 6f 20 30 78 30 30 20  e. Add two 0x00 
f5a0: 62 79 74 65 73 20 74 68 65 20 65 6e 64 20 6f 66  bytes the end of
f5b0: 20 74 68 65 20 62 75 66 66 65 72 2e 0a 20 20 20   the buffer..   
f5c0: 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6e 20 63   ** This is in c
f5d0: 61 73 65 20 74 68 65 20 73 61 6d 70 6c 65 20 72  ase the sample r
f5e0: 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
f5f0: 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
f600: 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  , the.    ** sql
f610: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
f620: 6d 70 61 72 65 28 29 20 6d 61 79 20 72 65 61 64  mpare() may read
f630: 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
f640: 74 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  ts past the.    
f650: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  ** end of the al
f660: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 62  located buffer b
f670: 65 66 6f 72 65 20 69 74 20 72 65 61 6c 69 7a 65  efore it realize
f680: 73 20 69 74 20 69 73 20 64 65 61 6c 69 6e 67 20  s it is dealing 
f690: 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 63 6f  with.    ** a co
f6a0: 72 72 75 70 74 20 72 65 63 6f 72 64 2e 20 41 64  rrupt record. Ad
f6b0: 64 69 6e 67 20 74 68 65 20 74 77 6f 20 30 78 30  ding the two 0x0
f6c0: 30 20 62 79 74 65 73 20 70 72 65 76 65 6e 74 73  0 bytes prevents
f6d0: 20 74 68 69 73 20 66 72 6f 6d 20 63 61 75 73 69   this from causi
f6e0: 6e 67 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  ng.    ** a buff
f6f0: 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 2a 2f  er overread.  */
f700: 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 20  .    pSample->n 
f710: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f720: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29  _bytes(pStmt, 4)
f730: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 70  ;.    pSample->p
f740: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
f750: 6f 63 5a 65 72 6f 28 64 62 2c 20 70 53 61 6d 70  ocZero(db, pSamp
f760: 6c 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 20 20  le->n + 2);.    
f770: 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d  if( pSample->p==
f780: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f790: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
f7a0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
f7b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f7c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
f7d0: 28 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 29 7b 0a  ( pSample->n ){.
f7e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53 61        memcpy(pSa
f7f0: 6d 70 6c 65 2d 3e 70 2c 20 73 71 6c 69 74 65 33  mple->p, sqlite3
f800: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
f810: 6d 74 2c 20 34 29 2c 20 70 53 61 6d 70 6c 65 2d  mt, 4), pSample-
f820: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  >n);.    }.    p
f830: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a  Idx->nSample++;.
f840: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f850: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
f860: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
f870: 4c 49 54 45 5f 4f 4b 20 29 20 69 6e 69 74 41 76  LITE_OK ) initAv
f880: 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20  gEq(pPrevIdx);. 
f890: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f8a0: 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e  *.** Load conten
f8b0: 74 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  t from the sqlit
f8c0: 65 5f 73 74 61 74 34 20 61 6e 64 20 73 71 6c 69  e_stat4 and sqli
f8d0: 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20  te_stat3 tables 
f8e0: 69 6e 74 6f 20 0a 2a 2a 20 74 68 65 20 49 6e 64  into .** the Ind
f8f0: 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  ex.aSample[] arr
f900: 61 79 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63  ays of all indic
f910: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
f920: 74 20 6c 6f 61 64 53 74 61 74 34 28 73 71 6c 69  t loadStat4(sqli
f930: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
f940: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74  har *zDb){.  int
f950: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f970: 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f  Result codes fro
f980: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
f990: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
f9a0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
f9b0: 6c 65 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  le );.  if( sqli
f9c0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
f9d0: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
f9e0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20   zDb) ){.    rc 
f9f0: 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62  = loadStatTbl(db
fa00: 2c 20 30 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  , 0,.      "SELE
fa10: 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20  CT idx,count(*) 
fa20: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
fa30: 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69 64  tat4 GROUP BY id
fa40: 78 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45  x", .      "SELE
fa50: 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e  CT idx,neq,nlt,n
fa60: 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20  dlt,sample FROM 
fa70: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 22  %Q.sqlite_stat4"
fa80: 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20  ,.      zDb.    
fa90: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
faa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
fab0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
fac0: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
fad0: 33 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  3", zDb) ){.    
fae0: 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c  rc = loadStatTbl
faf0: 28 64 62 2c 20 31 2c 0a 20 20 20 20 20 20 22 53  (db, 1,.      "S
fb00: 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28  ELECT idx,count(
fb10: 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  *) FROM %Q.sqlit
fb20: 65 5f 73 74 61 74 33 20 47 52 4f 55 50 20 42 59  e_stat3 GROUP BY
fb30: 20 69 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53   idx", .      "S
fb40: 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c  ELECT idx,neq,nl
fb50: 74 2c 6e 64 6c 74 2c 73 71 6c 69 74 65 5f 72 65  t,ndlt,sqlite_re
fb60: 63 6f 72 64 28 73 61 6d 70 6c 65 29 20 46 52 4f  cord(sample) FRO
fb70: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
fb80: 33 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20  3",.      zDb.  
fb90: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75    );.  }..  retu
fba0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
fbb0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
fbc0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
fbd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  */../*.** Load t
fbe0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
fbf0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61  e sqlite_stat1 a
fc00: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f  nd sqlite_stat3/
fc10: 34 20 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a  4 tables. The.**
fc20: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c   contents of sql
fc30: 69 74 65 5f 73 74 61 74 31 20 61 72 65 20 75 73  ite_stat1 are us
fc40: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
fc50: 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
fc60: 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54  t[].** arrays. T
fc70: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73  he contents of s
fc80: 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 61 72  qlite_stat3/4 ar
fc90: 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61  e used to popula
fca0: 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78 2e  te the.** Index.
fcb0: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73  aSample[] arrays
fcc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
fcd0: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
fce0: 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  e is not present
fcf0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
fd00: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a  , SQLITE_ERROR.*
fd10: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  * is returned. I
fd20: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 76 65  n this case, eve
fd30: 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
fd40: 4c 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64  LE_STAT3/4 was d
fd50: 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69 6e  efined .** durin
fd60: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
fd70: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
fd80: 74 33 2f 34 20 74 61 62 6c 65 20 69 73 20 70 72  t3/4 table is pr
fd90: 65 73 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20 69  esent, no data i
fda0: 73 20 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  s .** read from 
fdb0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  it..**.** If SQL
fdc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
fdd0: 2f 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 64  /4 was defined d
fde0: 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f  uring compilatio
fdf0: 6e 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 73 71  n and the .** sq
fe00: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
fe10: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
fe20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
fe30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73   SQLITE_ERROR is
fe40: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 48 6f  .** returned. Ho
fe50: 77 65 76 65 72 2c 20 69 6e 20 74 68 69 73 20 63  wever, in this c
fe60: 61 73 65 2c 20 64 61 74 61 20 69 73 20 72 65 61  ase, data is rea
fe70: 64 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  d from the sqlit
fe80: 65 5f 73 74 61 74 31 0a 2a 2a 20 74 61 62 6c 65  e_stat1.** table
fe90: 20 28 69 66 20 69 74 20 69 73 20 70 72 65 73 65   (if it is prese
fea0: 6e 74 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  nt) before retur
feb0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
fec0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
fed0: 72 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rs, this functio
fee0: 6e 20 61 6c 77 61 79 73 20 73 65 74 73 20 64 62  n always sets db
fef0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
ff00: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  ** This means if
ff10: 20 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65 73   the caller does
ff20: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
ff30: 6f 74 68 65 72 20 65 72 72 6f 72 73 2c 20 74 68  other errors, th
ff40: 65 20 72 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65  e return.** code
ff50: 20 6d 61 79 20 62 65 20 69 67 6e 6f 72 65 64 2e   may be ignored.
ff60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41  .*/.int sqlite3A
ff70: 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69  nalysisLoad(sqli
ff80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
ff90: 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66  ){.  analysisInf
ffa0: 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45  o sInfo;.  HashE
ffb0: 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a  lem *i;.  char *
ffc0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  zSql;.  int rc =
ffd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 63   SQLITE_OK;.  Sc
ffe0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
fff0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
10000 68 65 6d 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  hema;..  assert(
10010 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
10020 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
10030 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
10040 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  .pBt!=0 );..  /*
10050 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72   Clear any prior
10060 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
10070 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10080 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
10090 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
100a0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
100b0 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
100c0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  >tblHash); i; i=
100d0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
100e0 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
100f0 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
10100 44 61 74 61 28 69 29 3b 0a 20 20 20 20 70 54 61  Data(i);.    pTa
10110 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 3d 20 7e  b->tabFlags &= ~
10120 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20 7d  TF_HasStat1;.  }
10130 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
10140 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
10150 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20  a->idxHash); i; 
10160 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
10170 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  (i)){.    Index 
10180 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
10190 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 70  shData(i);.    p
101a0 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 3d 20  Idx->hasStat1 = 
101b0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
101c0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
101d0 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
101e0 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
101f0 70 6c 65 73 28 64 62 2c 20 70 49 64 78 29 3b 0a  ples(db, pIdx);.
10200 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
10210 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
10220 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65 77  }..  /* Load new
10230 20 73 74 61 74 69 73 74 69 63 73 20 6f 75 74 20   statistics out 
10240 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
10250 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  at1 table */.  s
10260 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Info.db = db;.  
10270 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 20  sInfo.zDatabase 
10280 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
10290 44 62 53 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73  DbSName;.  if( s
102a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
102b0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
102c0 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  1", sInfo.zDatab
102d0 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 7a  ase)!=0 ){.    z
102e0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
102f0 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
10300 20 20 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64    "SELECT tbl,id
10310 78 2c 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73  x,stat FROM %Q.s
10320 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49  qlite_stat1", sI
10330 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  nfo.zDatabase);.
10340 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
10350 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
10360 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
10390 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e  xec(db, zSql, an
103a0 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26 73  alysisLoader, &s
103b0 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  Info, 0);.      
103c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
103d0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zSql);.    }. 
103e0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 61 70 70   }..  /* Set app
103f0 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
10400 73 20 6f 6e 20 61 6c 6c 20 69 6e 64 65 78 65 73  s on all indexes
10410 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 71 6c 69   not in the sqli
10420 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a  te_stat1 table *
10430 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
10440 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10450 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
10460 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
10470 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
10480 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b  ma->idxHash); i;
10490 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
104a0 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  t(i)){.    Index
104b0 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
104c0 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
104d0 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  if( !pIdx->hasSt
104e0 61 74 31 20 29 20 73 71 6c 69 74 65 33 44 65 66  at1 ) sqlite3Def
104f0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29  aultRowEst(pIdx)
10500 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64  ;.  }..  /* Load
10510 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20   the statistics 
10520 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
10530 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a  stat4 table. */.
10540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10550 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10560 41 54 34 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  AT4.  if( rc==SQ
10570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
10580 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
10590 73 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 72 63 20  sable++;.    rc 
105a0 3d 20 6c 6f 61 64 53 74 61 74 34 28 64 62 2c 20  = loadStat4(db, 
105b0 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
105c0 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
105d0 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a  ide.bDisable--;.
105e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
105f0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
10600 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
10610 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
10620 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64  ext(i)){.    Ind
10630 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
10640 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
10650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10660 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  Idx->aiRowEst);.
10670 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 45      pIdx->aiRowE
10680 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  st = 0;.  }.#end
10690 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
106a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
106b0 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
106c0 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
106d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64  urn rc;.}...#end
106e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
106f0 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a           T_ANALYZE */.