/ Hex Artifact Content
Login

Artifact 9ffcf93866bffb8951a232f9ed770388847ac33dae2bf57fc6c7faf1f3fb7d75:


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 30 2c 20 64 62 2c  FindTable(0, db,
2560: 20 7a 54 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53   zTab, pDb->zDbS
2570: 4e 61 6d 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Name))==0 ){.   
2580: 20 20 20 69 66 28 20 61 54 61 62 6c 65 5b 69 5d     if( aTable[i]
2590: 2e 7a 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  .zCols ){.      
25a0: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f    /* The sqlite_
25b0: 73 74 61 74 4e 20 74 61 62 6c 65 20 64 6f 65 73  statN table does
25c0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 43 72 65 61   not exist. Crea
25d0: 74 65 20 69 74 2e 20 4e 6f 74 65 20 74 68 61 74  te it. Note that
25e0: 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   a .        ** s
25f0: 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 74 68  ide-effect of th
2600: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
2610: 74 61 74 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c  tatement is to l
2620: 65 61 76 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eave the rootpag
2630: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
2640: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69   the new table i
2650: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
2660: 65 2d 3e 72 65 67 52 6f 6f 74 2e 20 54 68 69 73  e->regRoot. This
2670: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20   is important . 
2680: 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
2690: 65 20 74 68 65 20 4f 70 65 6e 57 72 69 74 65 20  e the OpenWrite 
26a0: 6f 70 63 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c  opcode below wil
26b0: 6c 20 62 65 20 6e 65 65 64 69 6e 67 20 69 74 2e  l be needing it.
26c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
26d0: 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c  te3SchemaWritabl
26e0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
26f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
2700: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
2710: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e,.            "
2720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
2730: 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 44  %s(%s)", pDb->zD
2740: 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61 54  bSName, zTab, aT
2750: 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20  able[i].zCols.  
2760: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2770: 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61 72   aRoot[i] = pPar
2780: 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20 20  se->regRoot;.   
2790: 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c 5b       aCreateTbl[
27a0: 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49 53  i] = OPFLAG_P2IS
27b0: 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  REG;.      }.   
27c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27d0: 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   The table alrea
27e0: 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a 57  dy exists. If zW
27f0: 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  here is not NULL
2800: 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74  , delete all ent
2810: 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20 61  ries .      ** a
2820: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2830: 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65 2e  he table zWhere.
2840: 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e 55   If zWhere is NU
2850: 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a 20  LL, delete the. 
2860: 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20 63       ** entire c
2870: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
2880: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2890: 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74 2d  Root[i] = pStat-
28a0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43 72  >tnum;.      aCr
28b0: 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b 0a  eateTbl[i] = 0;.
28c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
28d0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
28e0: 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c  Db, aRoot[i], 1,
28f0: 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66   zTab);.      if
2900: 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( zWhere ){.    
2910: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
2920: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
2930: 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
2940: 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
2950: 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
2960: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
2970: 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65 72  ame, zTab, zWher
2980: 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20 20  eType, zWhere.  
2990: 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20        );.#ifdef 
29a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
29b0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20  EUPDATE_HOOK.   
29c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d     }else if( db-
29d0: 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
29e0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
29f0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
2a00: 65 28 70 50 61 72 73 65 2c 20 22 44 45 4c 45 54  e(pParse, "DELET
2a10: 45 20 46 52 4f 4d 20 25 51 2e 25 73 22 2c 20 70  E FROM %Q.%s", p
2a20: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 54  Db->zDbSName, zT
2a30: 61 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ab);.#endif.    
2a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a50: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73   /* The sqlite_s
2a60: 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 20 61  tat[134] table a
2a70: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
2a80: 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e  Delete all rows.
2a90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ab0: 20 4f 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f 74   OP_Clear, aRoot
2ac0: 5b 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  [i], iDb);.     
2ad0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2ae0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  /* Open the sqli
2af0: 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61 62  te_stat[134] tab
2b00: 6c 65 73 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  les for writing.
2b10: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61   */.  for(i=0; a
2b20: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b 20  Table[i].zCols; 
2b30: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2b40: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ( i<ArraySize(aT
2b50: 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 73 71 6c  able) );.    sql
2b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
2b70: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
2b80: 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20 61  e, iStatCur+i, a
2b90: 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33 29  Root[i], iDb, 3)
2ba0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2bb0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 43 72  eChangeP5(v, aCr
2bc0: 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20 20  eateTbl[i]);.   
2bd0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2be0: 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65   aTable[i].zName
2bf0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
2c00: 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d   Recommended num
2c10: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
2c20: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a  or sqlite_stat4.
2c30: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c40: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a  E_STAT4_SAMPLES.
2c50: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
2c60: 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 32 34  STAT4_SAMPLES 24
2c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2c80: 68 72 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f  hree SQL functio
2c90: 6e 73 20 2d 20 73 74 61 74 5f 69 6e 69 74 28 29  ns - stat_init()
2ca0: 2c 20 73 74 61 74 5f 70 75 73 68 28 29 2c 20 61  , stat_push(), a
2cb0: 6e 64 20 73 74 61 74 5f 67 65 74 28 29 20 2d 0a  nd stat_get() -.
2cc0: 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74  ** share an inst
2cd0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2ce0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2cf0: 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74  to hold their st
2d00: 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ate.** informati
2d10: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
2d20: 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75 6d  truct Stat4Accum
2d30: 20 53 74 61 74 34 41 63 63 75 6d 3b 0a 74 79 70   Stat4Accum;.typ
2d40: 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61 74  edef struct Stat
2d50: 34 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d  4Sample Stat4Sam
2d60: 70 6c 65 3b 0a 73 74 72 75 63 74 20 53 74 61 74  ple;.struct Stat
2d70: 34 53 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77  4Sample {.  tRow
2d80: 63 6e 74 20 2a 61 6e 45 71 3b 20 20 20 20 20 20  cnt *anEq;      
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2da0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20  qlite_stat4.nEq 
2db0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  */.  tRowcnt *an
2dc0: 44 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  DLt;            
2dd0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73       /* sqlite_s
2de0: 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66  tat4.nDLt */.#if
2df0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2e00: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
2e10: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74  .  tRowcnt *anLt
2e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e30: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2e40: 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f  t4.nLt */.  unio
2e50: 6e 20 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77  n {.    i64 iRow
2e60: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2e80: 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f   in main table o
2e90: 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20  f the key */.   
2ea0: 20 75 38 20 2a 61 52 6f 77 69 64 3b 20 20 20 20   u8 *aRowid;    
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 4b 65 79 20 66 6f 72 20 57 49 54 48   /* Key for WITH
2ed0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
2ee0: 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32   */.  } u;.  u32
2ef0: 20 6e 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   nRowid;        
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f10: 53 69 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20  Sizeof aRowid[] 
2f20: 2a 2f 0a 20 20 75 38 20 69 73 50 53 61 6d 70 6c  */.  u8 isPSampl
2f30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2f40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f50: 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  a periodic sampl
2f60: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  e */.  int iCol;
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21 69 73         /* If !is
2f90: 50 53 61 6d 70 6c 65 2c 20 74 68 65 20 72 65 61  PSample, the rea
2fa0: 73 6f 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f  son for inclusio
2fb0: 6e 20 2a 2f 0a 20 20 75 33 32 20 69 48 61 73 68  n */.  u32 iHash
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72 65         /* Tiebre
2fe0: 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e  aker hash */.#en
2ff0: 64 69 66 0a 7d 3b 20 20 20 20 20 20 20 20 20 20  dif.};          
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 20 20 20 0a 73 74 72 75 63            .struc
3030: 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a 20  t Stat4Accum {. 
3040: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20   tRowcnt nRow;  
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3060: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
3070: 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
3080: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50   */.  tRowcnt nP
3090: 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20  Sample;         
30a0: 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20  /* How often to 
30b0: 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73 61  do a periodic sa
30c0: 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  mple */.  int nC
30d0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
30e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65   columns in inde
3100: 78 20 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a  x + pk/rowid */.
3110: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3130: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
3140: 6f 6c 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20 70  olumns w/o the p
3150: 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  k/rowid */.  int
3160: 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20   mxSample;      
3170: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3180: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  m number of samp
3190: 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74  les to accumulat
31a0: 65 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70  e */.  Stat4Samp
31b0: 6c 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20  le current;     
31c0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20   /* Current row 
31d0: 61 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65  as a Stat4Sample
31e0: 20 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20   */.  u32 iPrn; 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  /* Pseudo-random
3210: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
3220: 20 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53   sampling */.  S
3230: 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73  tat4Sample *aBes
3240: 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  t;       /* Arra
3250: 79 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73  y of nCol best s
3260: 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  amples */.  int 
3270: 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  iMin;           
3280: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
3290: 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77  n a[] of entry w
32a0: 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72  ith minimum scor
32b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70  e */.  int nSamp
32c0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
32d0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
32e0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f  er of samples */
32f0: 0a 20 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65 72  .  int nMaxEqZer
3300: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
3310: 4d 61 78 20 6c 65 61 64 69 6e 67 20 30 20 69 6e  Max leading 0 in
3320: 20 61 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79 20   anEq[] for any 
3330: 61 5b 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  a[] entry */.  i
3340: 6e 74 20 69 47 65 74 3b 20 20 20 20 20 20 20 20  nt iGet;        
3350: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3360: 78 20 6f 66 20 63 75 72 72 65 6e 74 20 73 61 6d  x of current sam
3370: 70 6c 65 20 61 63 63 65 73 73 65 64 20 62 79 20  ple accessed by 
3380: 73 74 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20 20  stat_get() */.  
3390: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b 20  Stat4Sample *a; 
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
33b0: 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20 53  ay of mxSample S
33c0: 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65 63  tat4Sample objec
33d0: 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ts */.  sqlite3 
33e0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
33f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
3400: 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d 61  nnection, for ma
3410: 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lloc() */.};../*
3420: 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20   Reclaim memory 
3430: 75 73 65 64 20 62 79 20 61 20 53 74 61 74 34 53  used by a Stat4S
3440: 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66 20  ample.*/.#ifdef 
3450: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3460: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61  AT3_OR_STAT4.sta
3470: 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43  tic void sampleC
3480: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
3490: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
34a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
34b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
34c0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
34d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
34e0: 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 20  ->u.aRowid);.   
34f0: 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a   p->nRowid = 0;.
3500: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
3510: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3520: 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66 20 61 20  BLOB value of a 
3530: 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66 20  ROWID.*/.#ifdef 
3540: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3550: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61  AT3_OR_STAT4.sta
3560: 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 53  tic void sampleS
3570: 65 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  etRowid(sqlite3 
3580: 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65  *db, Stat4Sample
3590: 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73   *p, int n, cons
35a0: 74 20 75 38 20 2a 70 44 61 74 61 29 7b 0a 20 20  t u8 *pData){.  
35b0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
35c0: 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64  .  if( p->nRowid
35d0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
35e0: 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64  (db, p->u.aRowid
35f0: 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69 64  );.  p->u.aRowid
3600: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3610: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b 0a  ocRawNN(db, n);.
3620: 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77 69    if( p->u.aRowi
3630: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  d ){.    p->nRow
3640: 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63  id = n;.    memc
3650: 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c 20  py(p->u.aRowid, 
3660: 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65 6c  pData, n);.  }el
3670: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69  se{.    p->nRowi
3680: 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d = 0;.  }.}.#en
3690: 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  dif../* Initiali
36a0: 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20 76  ze the INTEGER v
36b0: 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44 2e  alue of a ROWID.
36c0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
36d0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
36e0: 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20 76  R_STAT4.static v
36f0: 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f 77  oid sampleSetRow
3700: 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33 20  idInt64(sqlite3 
3710: 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65  *db, Stat4Sample
3720: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
3730: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  {.  assert( db!=
3740: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52  0 );.  if( p->nR
3750: 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44 62  owid ) sqlite3Db
3760: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52  Free(db, p->u.aR
3770: 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f 77  owid);.  p->nRow
3780: 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e 69  id = 0;.  p->u.i
3790: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
37a0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
37b0: 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
37c0: 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a 70  ts of object (*p
37d0: 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54 6f  From) into (*pTo
37e0: 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  )..*/.#ifdef SQL
37f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3800: 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63  _OR_STAT4.static
3810: 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70 79   void sampleCopy
3820: 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20  (Stat4Accum *p, 
3830: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54 6f  Stat4Sample *pTo
3840: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
3850: 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69 73  From){.  pTo->is
3860: 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d 2d  PSample = pFrom-
3870: 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70 54  >isPSample;.  pT
3880: 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d 2d  o->iCol = pFrom-
3890: 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69 48  >iCol;.  pTo->iH
38a0: 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48 61  ash = pFrom->iHa
38b0: 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  sh;.  memcpy(pTo
38c0: 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e 61  ->anEq, pFrom->a
38d0: 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77  nEq, sizeof(tRow
38e0: 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20  cnt)*p->nCol);. 
38f0: 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 4c   memcpy(pTo->anL
3900: 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c 20  t, pFrom->anLt, 
3910: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
3920: 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63  p->nCol);.  memc
3930: 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20 70  py(pTo->anDLt, p
3940: 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69 7a  From->anDLt, siz
3950: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e  eof(tRowcnt)*p->
3960: 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46 72  nCol);.  if( pFr
3970: 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20  om->nRowid ){.  
3980: 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64    sampleSetRowid
3990: 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72  (p->db, pTo, pFr
39a0: 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72 6f  om->nRowid, pFro
39b0: 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20  m->u.aRowid);.  
39c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c  }else{.    sampl
39d0: 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70  eSetRowidInt64(p
39e0: 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  ->db, pTo, pFrom
39f0: 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20 7d  ->u.iRowid);.  }
3a00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3a10: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
3a20: 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41 63  ory of a Stat4Ac
3a30: 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  cum structure..*
3a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
3a50: 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76 6f  at4Destructor(vo
3a60: 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74 61  id *pOld){.  Sta
3a70: 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74  t4Accum *p = (St
3a80: 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b 0a  at4Accum*)pOld;.
3a90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3aa0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
3ab0: 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  AT4.  int i;.  f
3ac0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
3ad0: 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  l; i++) sampleCl
3ae0: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 42  ear(p->db, p->aB
3af0: 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69 3d  est+i);.  for(i=
3b00: 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65  0; i<p->mxSample
3b10: 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65  ; i++) sampleCle
3b20: 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b 69  ar(p->db, p->a+i
3b30: 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61 72  );.  sampleClear
3b40: 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72  (p->db, &p->curr
3b50: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ent);.#endif.  s
3b60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
3b70: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3b80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3b90: 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74  of the stat_init
3ba0: 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e 63  (N,K,C) SQL func
3bb0: 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65 20  tion. The three 
3bc0: 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72  parameters.** ar
3bd0: 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20 20  e:.**     N:    
3be0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  The number of co
3bf0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
3c00: 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ex including the
3c10: 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65 20   rowid/pk (note 
3c20: 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20 20  1).**     K:    
3c30: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  The number of co
3c40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
3c50: 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  ex excluding the
3c60: 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20 20   rowid/pk..**   
3c70: 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d 62    C:    The numb
3c80: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
3c90: 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32 29  e index (note 2)
3ca0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20 20  .**.** Note 1:  
3cb0: 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  In the special c
3cc0: 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65 72  ase of the cover
3cd0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 69  ing index that i
3ce0: 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 57  mplements a.** W
3cf0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
3d00: 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  le, N is the num
3d10: 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b  ber of PRIMARY K
3d20: 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74 20  EY columns, not 
3d30: 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
3d40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3d50: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
3d60: 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69 73  ** Note 2:  C is
3d70: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53   only used for S
3d80: 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 2e 0a  TAT3 and STAT4..
3d90: 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 65  **.** For indexe
3da0: 73 20 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72 6f  s on ordinary ro
3db0: 77 69 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d 4b  wid tables, N==K
3dc0: 2b 31 2e 20 20 42 75 74 20 66 6f 72 20 69 6e 64  +1.  But for ind
3dd0: 65 78 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48 4f  exes on.** WITHO
3de0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2c  UT ROWID tables,
3df0: 20 4e 3d 4b 2b 50 20 77 68 65 72 65 20 50 20 69   N=K+P where P i
3e00: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3e10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a  columns in the.*
3e20: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  * PRIMARY KEY of
3e30: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
3e40: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
3e50: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
3e60: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
3e70: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3e80: 62 6c 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20 61  ble as N==K as a
3e90: 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 0a 2a   special case..*
3ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3eb0: 65 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20  e allocates the 
3ec0: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
3ed0: 74 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79  t in heap memory
3ee0: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 0a 2a 2a  . The return .**
3ef0: 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
3f00: 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74 34  ter to the Stat4
3f10: 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20 54  Accum object.  T
3f20: 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20 74  he datatype of t
3f30: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
3f40: 75 65 20 69 73 20 42 4c 4f 42 2c 20 62 75 74 20  ue is BLOB, but 
3f50: 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  it is really jus
3f60: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
3f70: 68 65 20 53 74 61 74 34 41 63 63 75 6d 0a 2a 2a  he Stat4Accum.**
3f80: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
3f90: 69 63 20 76 6f 69 64 20 73 74 61 74 49 6e 69 74  ic void statInit
3fa0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3fb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3fc0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3fd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3fe0: 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d  .){.  Stat4Accum
3ff0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b   *p;.  int nCol;
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4020: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69   of columns in i
4030: 6e 64 65 78 20 62 65 69 6e 67 20 73 61 6d 70 6c  ndex being sampl
4040: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  ed */.  int nKey
4050: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4070: 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
4080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70   */.  int nColUp
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40a0: 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f        /* nCol ro
40b0: 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c 69  unded up for ali
40c0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  gnment */.  int 
40d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
40f0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
4100: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 73   allocate */.  s
4110: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4130: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
4140: 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20  ction */.#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4160: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
4170: 6e 74 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53 51  nt mxSample = SQ
4180: 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c  LITE_STAT4_SAMPL
4190: 45 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ES;.#endif..  /*
41a0: 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72 65   Decode the thre
41b0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  e function argum
41c0: 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44  ents */.  UNUSED
41d0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
41e0: 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  nCol = sqlit
41f0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4200: 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[0]);.  assert(
4210: 20 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43 6f   nCol>0 );.  nCo
4220: 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f  lUp = sizeof(tRo
4230: 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b  wcnt)<8 ? (nCol+
4240: 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20 20  1)&~1 : nCol;.  
4250: 6e 4b 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74 65  nKeyCol = sqlite
4260: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
4270: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
4280: 6e 4b 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29 3b  nKeyCol<=nCol );
4290: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
42a0: 6f 6c 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  ol>0 );..  /* Al
42b0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
42c0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
42d0: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
42e0: 65 63 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a  ect */.  n = siz
42f0: 65 6f 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73  eof(*p) .    + s
4300: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e  izeof(tRowcnt)*n
4310: 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20 20  ColUp           
4320: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41         /* Stat4A
4330: 63 63 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20  ccum.anEq */.   
4340: 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e   + sizeof(tRowcn
4350: 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20  t)*nColUp       
4360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4370: 61 74 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a  at4Accum.anDLt *
4380: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4390: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
43a0: 53 54 41 54 34 0a 20 20 20 20 2b 20 73 69 7a 65  STAT4.    + size
43b0: 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
43c0: 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Up              
43d0: 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75      /* Stat4Accu
43e0: 6d 2e 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20  m.anLt */.    + 
43f0: 73 69 7a 65 6f 66 28 53 74 61 74 34 53 61 6d 70  sizeof(Stat4Samp
4400: 6c 65 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70  le)*(nCol+mxSamp
4410: 6c 65 29 20 20 20 20 20 2f 2a 20 53 74 61 74 34  le)     /* Stat4
4420: 41 63 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61  Accum.aBest[], a
4430: 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65  [] */.    + size
4440: 6f 66 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43  of(tRowcnt)*3*nC
4450: 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d  olUp*(nCol+mxSam
4460: 70 6c 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a  ple).#endif.  ;.
4470: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63    db = sqlite3_c
4480: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
4490: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d  (context);.  p =
44a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
44b0: 5a 65 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69  Zero(db, n);.  i
44c0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
44d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
44e0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
44f0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
4500: 20 20 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64    }..  p->db = d
4510: 62 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30  b;.  p->nRow = 0
4520: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  ;.  p->nCol = nC
4530: 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ol;.  p->nKeyCol
4540: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 2d   = nKeyCol;.  p-
4550: 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d  >current.anDLt =
4560: 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d   (tRowcnt*)&p[1]
4570: 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ;.  p->current.a
4580: 6e 45 71 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e  nEq = &p->curren
4590: 74 2e 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b  t.anDLt[nColUp];
45a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
45b0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
45c0: 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 75 38  STAT4.  {.    u8
45d0: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45f0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   Allocated space
4600: 20 6e 6f 74 20 79 65 74 20 61 73 73 69 67 6e 65   not yet assigne
4610: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  d */.    int i; 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
4640: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
4650: 75 67 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d  ugh p->aSample[]
4660: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74   */..    p->iGet
4670: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78   = -1;.    p->mx
4680: 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c  Sample = mxSampl
4690: 65 3b 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70  e;.    p->nPSamp
46a0: 6c 65 20 3d 20 28 74 52 6f 77 63 6e 74 29 28 73  le = (tRowcnt)(s
46b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
46c0: 36 34 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78 53  64(argv[2])/(mxS
46d0: 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b  ample/3+1) + 1);
46e0: 0a 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e  .    p->current.
46f0: 61 6e 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72 65  anLt = &p->curre
4700: 6e 74 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b  nt.anEq[nColUp];
4710: 0a 20 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20 30  .    p->iPrn = 0
4720: 78 36 38 39 65 39 36 32 64 2a 28 75 33 32 29 6e  x689e962d*(u32)n
4730: 43 6f 6c 20 5e 20 30 78 64 30 39 34 34 35 36 35  Col ^ 0xd0944565
4740: 2a 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61  *(u32)sqlite3_va
4750: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29  lue_int(argv[2])
4760: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20  ;.  .    /* Set 
4770: 75 70 20 74 68 65 20 53 74 61 74 34 41 63 63 75  up the Stat4Accu
4780: 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74 5b  m.a[] and aBest[
4790: 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20 20  ] arrays */.    
47a0: 70 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20 53  p->a = (struct S
47b0: 74 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d 3e  tat4Sample*)&p->
47c0: 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f  current.anLt[nCo
47d0: 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42 65  lUp];.    p->aBe
47e0: 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61 6d  st = &p->a[mxSam
47f0: 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63 65  ple];.    pSpace
4800: 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b 6d   = (u8*)(&p->a[m
4810: 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a  xSample+nCol]);.
4820: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
4830: 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20  mxSample+nCol); 
4840: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
4850: 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f 77  [i].anEq = (tRow
4860: 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53  cnt *)pSpace; pS
4870: 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28  pace += (sizeof(
4880: 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55  tRowcnt) * nColU
4890: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  p);.      p->a[i
48a0: 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e  ].anLt = (tRowcn
48b0: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
48c0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
48d0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
48e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  ;.      p->a[i].
48f0: 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74  anDLt = (tRowcnt
4900: 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63   *)pSpace; pSpac
4910: 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f  e += (sizeof(tRo
4920: 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b  wcnt) * nColUp);
4930: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4940: 74 28 20 28 70 53 70 61 63 65 20 2d 20 28 75 38  t( (pSpace - (u8
4950: 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20  *)p)==n );.  .  
4960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4970: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
4980: 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c 20  ->aBest[i].iCol 
4990: 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = i;.    }.  }.#
49a0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74 75  endif..  /* Retu
49b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
49c0: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62  the allocated ob
49d0: 6a 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c 6c  ject to the call
49e0: 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  er.  Note that. 
49f0: 20 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f 69   ** only the poi
4a00: 6e 74 65 72 20 28 74 68 65 20 32 6e 64 20 70 61  nter (the 2nd pa
4a10: 72 61 6d 65 74 65 72 29 20 6d 61 74 74 65 72 73  rameter) matters
4a20: 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  .  The size of t
4a30: 68 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 28  he object.  ** (
4a40: 67 69 76 65 6e 20 62 79 20 74 68 65 20 33 72 64  given by the 3rd
4a50: 20 70 61 72 61 6d 65 74 65 72 29 20 69 73 20 6e   parameter) is n
4a60: 65 76 65 72 20 75 73 65 64 20 61 6e 64 20 63 61  ever used and ca
4a70: 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69 76  n be any positiv
4a80: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f  e.  ** value. */
4a90: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4aa0: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
4ab0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20 73  p, sizeof(*p), s
4ac0: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29 3b  tat4Destructor);
4ad0: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
4ae0: 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74  FuncDef statInit
4af0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b  Funcdef = {.  2+
4b00: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
4b10: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
4b20: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
4b30: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
4b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b50: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
4b60: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4b70: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
4b80: 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20   statInit,      
4b90: 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20    /* xSFunc */. 
4ba0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
4bb0: 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a    /* xFinalize *
4bc0: 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  /.  0, 0,       
4bd0: 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20       /* xValue, 
4be0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73  xInverse */.  "s
4bf0: 74 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20 2f  tat_init",     /
4c00: 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d  * zName */.  {0}
4c10: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
4c20: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
4c30: 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20 70  /*.** pNew and p
4c40: 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61 6e  Old are both can
4c50: 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69 6f  didate non-perio
4c60: 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c 65  dic samples sele
4c70: 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68 65  cted for .** the
4c80: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70 4e   same column (pN
4c90: 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e  ew->iCol==pOld->
4ca0: 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67 20  iCol). Ignoring 
4cb0: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  this column and 
4cc0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
4cd0: 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69 6e  only any trailin
4ce0: 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  g columns and th
4cf0: 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76 61  e sample hash va
4d00: 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  lue, this.** fun
4d10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
4d20: 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e 65  ue if sample pNe
4d30: 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66 65  w is to be prefe
4d40: 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a  rred over pOld..
4d50: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
4d60: 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65 20  s, if we assume 
4d70: 74 68 61 74 20 74 68 65 20 63 61 72 64 69 6e 61  that the cardina
4d80: 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20 73 65  lities of the se
4d90: 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e  lected.** column
4da0: 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70 4f   for pNew and pO
4db0: 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69 73  ld are equal, is
4dc0: 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65 66   pNew to be pref
4dd0: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
4de0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4df0: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
4e00: 74 20 66 6f 72 20 65 61 63 68 20 61 72 67 75 6d  t for each argum
4e10: 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65 20  ent sample, the 
4e20: 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  contents of.** t
4e30: 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20  he anEq[] array 
4e40: 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e  from pSample->an
4e50: 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c  Eq[pSample->iCol
4e60: 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65 20  +1] onwards are 
4e70: 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  valid. .*/.stati
4e80: 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42 65  c int sampleIsBe
4e90: 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61 74  tterPost(.  Stat
4ea0: 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20  4Accum *pAccum, 
4eb0: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
4ec0: 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53 61  pNew, .  Stat4Sa
4ed0: 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20  mple *pOld.){.  
4ee0: 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63 75  int nCol = pAccu
4ef0: 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  m->nCol;.  int i
4f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
4f10: 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43  ->iCol==pOld->iC
4f20: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4e  ol );.  for(i=pN
4f30: 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e 43  ew->iCol+1; i<nC
4f40: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
4f50: 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3e  ( pNew->anEq[i]>
4f60: 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20  pOld->anEq[i] ) 
4f70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
4f80: 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3c  ( pNew->anEq[i]<
4f90: 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20  pOld->anEq[i] ) 
4fa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4fb0: 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68 3e  if( pNew->iHash>
4fc0: 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72 65  pOld->iHash ) re
4fd0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
4fe0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
4ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5000: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
5010: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
5020: 72 75 65 20 69 66 20 70 4e 65 77 20 69 73 20 74  rue if pNew is t
5030: 6f 20 62 65 20 70 72 65 66 65 72 72 65 64 20 6f  o be preferred o
5040: 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20  ver pOld..**.** 
5050: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
5060: 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20 65  sumes that for e
5070: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61 6d  ach argument sam
5080: 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ple, the content
5090: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71  s of.** the anEq
50a0: 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70 53  [] array from pS
50b0: 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d  ample->anEq[pSam
50c0: 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61 72  ple->iCol] onwar
50d0: 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a  ds are valid. .*
50e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6d  /.static int sam
50f0: 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20 53  pleIsBetter(.  S
5100: 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75  tat4Accum *pAccu
5110: 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c  m, .  Stat4Sampl
5120: 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74  e *pNew, .  Stat
5130: 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b  4Sample *pOld.){
5140: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e 65  .  tRowcnt nEqNe
5150: 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70  w = pNew->anEq[p
5160: 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74 52  New->iCol];.  tR
5170: 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20 70  owcnt nEqOld = p
5180: 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d 3e  Old->anEq[pOld->
5190: 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iCol];..  assert
51a0: 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c  ( pOld->isPSampl
51b0: 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69 73  e==0 && pNew->is
51c0: 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20  PSample==0 );.  
51d0: 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34 20  assert( IsStat4 
51e0: 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d  || (pNew->iCol==
51f0: 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3d  0 && pOld->iCol=
5200: 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28 6e  =0) );..  if( (n
5210: 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29 20  EqNew>nEqOld) ) 
5220: 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66  return 1;.#ifdef
5230: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5240: 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e 65  TAT4.  if( nEqNe
5250: 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20 20  w==nEqOld ){.   
5260: 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3c   if( pNew->iCol<
5270: 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65 74  pOld->iCol ) ret
5280: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
5290: 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70  n (pNew->iCol==p
52a0: 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61 6d  Old->iCol && sam
52b0: 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74 28  pleIsBetterPost(
52c0: 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70 4f  pAccum, pNew, pO
52d0: 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ld));.  }.  retu
52e0: 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65  rn 0;.#else.  re
52f0: 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e 45  turn (nEqNew==nE
5300: 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69 48  qOld && pNew->iH
5310: 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 29  ash>pOld->iHash)
5320: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
5330: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
5340: 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a 70  nts of sample *p
5350: 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e  New into the p->
5360: 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e 65  a[] array. If ne
5370: 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d 6f  cessary,.** remo
5380: 76 65 20 74 68 65 20 6c 65 61 73 74 20 64 65 73  ve the least des
5390: 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66 72  irable sample fr
53a0: 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61 6b  om p->a[] to mak
53b0: 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74 69  e room..*/.stati
53c0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e 73  c void sampleIns
53d0: 65 72 74 28 53 74 61 74 34 41 63 63 75 6d 20 2a  ert(Stat4Accum *
53e0: 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  p, Stat4Sample *
53f0: 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65 72  pNew, int nEqZer
5400: 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70 6c  o){.  Stat4Sampl
5410: 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b 0a  e *pSample = 0;.
5420: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
5430: 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20 6e  rt( IsStat4 || n
5440: 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23 69  EqZero==0 );..#i
5450: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5460: 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 74  LE_STAT4.  /* St
5470: 61 74 34 41 63 63 75 6d 2e 6e 4d 61 78 45 71 5a  at4Accum.nMaxEqZ
5480: 65 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 68  ero is set to th
5490: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
54a0: 20 6f 66 20 6c 65 61 64 69 6e 67 20 30 0a 20 20   of leading 0.  
54b0: 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ** values in the
54c0: 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 6f 66   anEq[] array of
54d0: 20 61 6e 79 20 73 61 6d 70 6c 65 20 69 6e 20 53   any sample in S
54e0: 74 61 74 34 41 63 63 75 6d 2e 61 5b 5d 2e 20 49  tat4Accum.a[]. I
54f0: 6e 0a 20 20 2a 2a 20 6f 74 68 65 72 20 77 6f 72  n.  ** other wor
5500: 64 73 2c 20 69 66 20 6e 4d 61 78 45 71 5a 65 72  ds, if nMaxEqZer
5510: 6f 20 69 73 20 6e 2c 20 74 68 65 6e 20 69 74 20  o is n, then it 
5520: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
5530: 61 74 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  at there.  ** ar
5540: 65 20 6e 6f 20 73 61 6d 70 6c 65 73 20 77 69 74  e no samples wit
5550: 68 20 53 74 61 74 34 53 61 6d 70 6c 65 2e 61 6e  h Stat4Sample.an
5560: 45 71 5b 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d 3e  Eq[m]==0 for (m>
5570: 3d 6e 29 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 45  =n). */.  if( nE
5580: 71 5a 65 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71 5a  qZero>p->nMaxEqZ
5590: 65 72 6f 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d  ero ){.    p->nM
55a0: 61 78 45 71 5a 65 72 6f 20 3d 20 6e 45 71 5a 65  axEqZero = nEqZe
55b0: 72 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  ro;.  }.  if( pN
55c0: 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30  ew->isPSample==0
55d0: 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d   ){.    Stat4Sam
55e0: 70 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d 20  ple *pUpgrade = 
55f0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5600: 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e  New->anEq[pNew->
5610: 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20 20  iCol]>0 );..    
5620: 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20 69  /* This sample i
5630: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 62 65  s being added be
5640: 63 61 75 73 65 20 74 68 65 20 70 72 65 66 69 78  cause the prefix
5650: 20 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63 6f   that ends in co
5660: 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43 6f  lumn .    ** iCo
5670: 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74 69  l occurs many ti
5680: 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mes in the table
5690: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77 65  . However, if we
56a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
56b0: 20 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61 6d    ** added a sam
56c0: 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20  ple that shares 
56d0: 74 68 69 73 20 70 72 65 66 69 78 2c 20 74 68 65  this prefix, the
56e0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
56f0: 20 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69 73   add.    ** this
5700: 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20 75   one. Instead, u
5710: 70 67 72 61 64 65 20 74 68 65 20 70 72 69 6f 72  pgrade the prior
5720: 69 74 79 20 6f 66 20 74 68 65 20 68 69 67 68 65  ity of the highe
5730: 73 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20 20  st priority.    
5740: 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d 70  ** existing samp
5750: 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20 74  le that shares t
5760: 68 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f 0a  his prefix.  */.
5770: 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61      for(i=p->nSa
5780: 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  mple-1; i>=0; i-
5790: 2d 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53  -){.      Stat4S
57a0: 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26 70  ample *pOld = &p
57b0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->a[i];.      if
57c0: 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e 65  ( pOld->anEq[pNe
57d0: 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20  w->iCol]==0 ){. 
57e0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
57f0: 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65 74  >isPSample ) ret
5800: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
5810: 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3e  ert( pOld->iCol>
5820: 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20  pNew->iCol );.  
5830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61        assert( sa
5840: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
5850: 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a 20  pNew, pOld) );. 
5860: 20 20 20 20 20 20 20 69 66 28 20 70 55 70 67 72         if( pUpgr
5870: 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c 65  ade==0 || sample
5880: 49 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c 64  IsBetter(p, pOld
5890: 2c 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a 20  , pUpgrade) ){. 
58a0: 20 20 20 20 20 20 20 20 20 70 55 70 67 72 61 64           pUpgrad
58b0: 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  e = pOld;.      
58c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
58d0: 7d 0a 20 20 20 20 69 66 28 20 70 55 70 67 72 61  }.    if( pUpgra
58e0: 64 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70 67  de ){.      pUpg
58f0: 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e 65  rade->iCol = pNe
5900: 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70  w->iCol;.      p
5910: 55 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70 55  Upgrade->anEq[pU
5920: 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d 20  pgrade->iCol] = 
5930: 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67 72  pNew->anEq[pUpgr
5940: 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20  ade->iCol];.    
5950: 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77 5f    goto find_new_
5960: 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  min;.    }.  }.#
5970: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6e  endif..  /* If n
5980: 65 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76 65  ecessary, remove
5990: 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f 20   sample iMin to 
59a0: 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
59b0: 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a 2f  e new sample. */
59c0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
59d0: 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  e>=p->mxSample )
59e0: 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c  {.    Stat4Sampl
59f0: 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b  e *pMin = &p->a[
5a00: 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52  p->iMin];.    tR
5a10: 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d  owcnt *anEq = pM
5a20: 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52  in->anEq;.    tR
5a30: 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d  owcnt *anLt = pM
5a40: 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74 52  in->anLt;.    tR
5a50: 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70  owcnt *anDLt = p
5a60: 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20  Min->anDLt;.    
5a70: 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64  sampleClear(p->d
5a80: 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d 65  b, pMin);.    me
5a90: 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d 69  mmove(pMin, &pMi
5aa0: 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  n[1], sizeof(p->
5ab0: 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70 6c  a[0])*(p->nSampl
5ac0: 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a 20  e-p->iMin-1));. 
5ad0: 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d     pSample = &p-
5ae0: 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d  >a[p->nSample-1]
5af0: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e  ;.    pSample->n
5b00: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Rowid = 0;.    p
5b10: 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61  Sample->anEq = a
5b20: 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  nEq;.    pSample
5b30: 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b  ->anDLt = anDLt;
5b40: 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e  .    pSample->an
5b50: 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20 70  Lt = anLt;.    p
5b60: 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6d  ->nSample = p->m
5b70: 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a 0a  xSample-1;.  }..
5b80: 20 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20 6c    /* The "rows l
5b90: 65 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74 68  ess-than" for th
5ba0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6d  e rowid column m
5bb0: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
5bc0: 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f  han that.  ** fo
5bd0: 72 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70 6c  r the last sampl
5be0: 65 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d 20  e in the p->a[] 
5bf0: 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
5c00: 2c 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77 6f  , the samples wo
5c10: 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74 20  uld.  ** be out 
5c20: 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69 66  of order. */.#if
5c30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5c40: 45 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74  E_STAT4.  assert
5c50: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20  ( p->nSample==0 
5c60: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
5c70: 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >anLt[p->nCol-1]
5c80: 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70   > p->a[p->nSamp
5c90: 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e 43  le-1].anLt[p->nC
5ca0: 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a  ol-1] );.#endif.
5cb0: 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
5cc0: 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a 20   new sample */. 
5cd0: 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61   pSample = &p->a
5ce0: 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20  [p->nSample];.  
5cf0: 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70 53  sampleCopy(p, pS
5d00: 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20 20  ample, pNew);.  
5d10: 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a 20  p->nSample++;.. 
5d20: 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72   /* Zero the fir
5d30: 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72 69  st nEqZero entri
5d40: 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d  es in the anEq[]
5d50: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65 6d   array. */.  mem
5d60: 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  set(pSample->anE
5d70: 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52 6f  q, 0, sizeof(tRo
5d80: 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b 0a  wcnt)*nEqZero);.
5d90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5da0: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69 6e  NABLE_STAT4. fin
5db0: 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64 69  d_new_min:.#endi
5dc0: 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  f.  if( p->nSamp
5dd0: 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le>=p->mxSample 
5de0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e 20  ){.    int iMin 
5df0: 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
5e00: 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65  0; i<p->mxSample
5e10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5e20: 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d  ( p->a[i].isPSam
5e30: 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ple ) continue;.
5e40: 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30        if( iMin<0
5e50: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
5e60: 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e  er(p, &p->a[iMin
5e70: 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a  ], &p->a[i]) ){.
5e80: 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69          iMin = i
5e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5ea0: 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e      assert( iMin
5eb0: 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d  >=0 );.    p->iM
5ec0: 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d  in = iMin;.  }.}
5ed0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5ee0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
5ef0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
5f00: 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f 66  * Field iChng of
5f10: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
5f20: 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68 61   scanned has cha
5f30: 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69 73  nged. So at this
5f40: 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72   point.** p->cur
5f50: 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  rent contains a 
5f60: 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66 6c  sample that refl
5f70: 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f 75  ects the previou
5f80: 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20  s row of the.** 
5f90: 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75 65  index. The value
5fa0: 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20   of anEq[iChng] 
5fb0: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
5fc0: 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61  nEq[] elements a
5fd0: 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 74  re.** correct at
5fe0: 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
5ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
6000: 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 53  lePushPrevious(S
6010: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e  tat4Accum *p, in
6020: 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65 66  t iChng){.#ifdef
6030: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6040: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  TAT4.  int i;.. 
6050: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79   /* Check if any
6060: 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68   samples from th
6070: 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79 20  e aBest[] array 
6080: 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65 64  should be pushed
6090: 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78  .  ** into Index
60a0: 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68  Sample.a[] at th
60b0: 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  is point.  */.  
60c0: 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32  for(i=(p->nCol-2
60d0: 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d  ); i>=iChng; i--
60e0: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
60f0: 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e  le *pBest = &p->
6100: 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70 42  aBest[i];.    pB
6110: 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 70  est->anEq[i] = p
6120: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
6130: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  ];.    if( p->nS
6140: 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c  ample<p->mxSampl
6150: 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  e || sampleIsBet
6160: 74 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26 70  ter(p, pBest, &p
6170: 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29 7b  ->a[p->iMin]) ){
6180: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
6190: 65 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69 29  ert(p, pBest, i)
61a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
61b0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6e 6f 20  * Check that no 
61c0: 73 61 6d 70 6c 65 20 63 6f 6e 74 61 69 6e 73 20  sample contains 
61d0: 61 6e 20 61 6e 45 71 5b 5d 20 65 6e 74 72 79 20  an anEq[] entry 
61e0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 66  with an index of
61f0: 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71 5a  .  ** p->nMaxEqZ
6200: 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20 73  ero or greater s
6210: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a 20  et to zero. */. 
6220: 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c   for(i=p->nSampl
6230: 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  e-1; i>=0; i--){
6240: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
6250: 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71 5a  for(j=p->nMaxEqZ
6260: 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  ero; j<p->nCol; 
6270: 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  j++) assert( p->
6280: 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20 29  a[i].anEq[j]>0 )
6290: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
62a0: 74 65 20 74 68 65 20 61 6e 45 71 5b 5d 20 66 69  te the anEq[] fi
62b0: 65 6c 64 73 20 6f 66 20 61 6e 79 20 73 61 6d 70  elds of any samp
62c0: 6c 65 73 20 61 6c 72 65 61 64 79 20 63 6f 6c 6c  les already coll
62d0: 65 63 74 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ected. */.  if( 
62e0: 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71 5a  iChng<p->nMaxEqZ
62f0: 65 72 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ero ){.    for(i
6300: 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69  =p->nSample-1; i
6310: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
6320: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
6330: 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d 3e  r(j=iChng; j<p->
6340: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
6350: 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e      if( p->a[i].
6360: 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d 3e  anEq[j]==0 ) p->
6370: 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20 70  a[i].anEq[j] = p
6380: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6a  ->current.anEq[j
6390: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
63a0: 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65  .    p->nMaxEqZe
63b0: 72 6f 20 3d 20 69 43 68 6e 67 3b 0a 20 20 7d 0a  ro = iChng;.  }.
63c0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
63d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
63e0: 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65 66  E_STAT3) && !def
63f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6400: 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28 20  LE_STAT4).  if( 
6410: 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  iChng==0 ){.    
6420: 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d  tRowcnt nLt = p-
6430: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30 5d  >current.anLt[0]
6440: 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 45  ;.    tRowcnt nE
6450: 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  q = p->current.a
6460: 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20  nEq[0];..    /* 
6470: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
6480: 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69   to be a periodi
6490: 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c  c sample. If so,
64a0: 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20   add it. */.    
64b0: 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61  if( (nLt/p->nPSa
64c0: 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71 29  mple)!=(nLt+nEq)
64d0: 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a  /p->nPSample ){.
64e0: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
64f0: 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a  .isPSample = 1;.
6500: 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65        sampleInse
6510: 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e  rt(p, &p->curren
6520: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  t, 0);.      p->
6530: 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c  current.isPSampl
6540: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
6550: 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66 20   ..    /* Or if 
6560: 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72 69  it is a non-peri
6570: 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64 64  odic sample. Add
6580: 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73 65   it in this case
6590: 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66 28   too. */.    if(
65a0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d   p->nSample<p->m
65b0: 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c 7c  xSample .     ||
65c0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
65d0: 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  p, &p->current, 
65e0: 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20  &p->a[p->iMin]) 
65f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 61  .    ){.      sa
6600: 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70  mpleInsert(p, &p
6610: 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20  ->current, 0);. 
6620: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6630: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6640: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
6650: 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f 50  STAT4.  UNUSED_P
6660: 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a 20  ARAMETER( p );. 
6670: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
6680: 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e 64  R( iChng );.#end
6690: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  if.}../*.** Impl
66a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
66b0: 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c 20  e stat_push SQL 
66c0: 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74 5f  function:  stat_
66d0: 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20 41  push(P,C,R).** A
66e0: 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  rguments:.**.** 
66f0: 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65 72     P     Pointer
6700: 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63   to the Stat4Acc
6710: 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74 65  um object create
6720: 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28 29  d by stat_init()
6730: 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e 64  .**    C     Ind
6740: 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20  ex of left-most 
6750: 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65 72  column to differ
6760: 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 72   from previous r
6770: 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20 52  ow.**    R     R
6780: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
6790: 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68 74  rent row.  Might
67a0: 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72 64   be a key record
67b0: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
67c0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
67d0: 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
67e0: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  s SQL function a
67f0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55  lways returns NU
6800: 4c 4c 2e 20 20 49 74 27 73 20 70 75 72 70 6f 73  LL.  It's purpos
6810: 65 20 69 74 20 74 6f 20 61 63 63 75 6d 75 6c 61  e it to accumula
6820: 74 65 0a 2a 2a 20 73 74 61 74 69 73 74 69 63 61  te.** statistica
6830: 6c 20 64 61 74 61 20 61 6e 64 2f 6f 72 20 73 61  l data and/or sa
6840: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 53 74 61  mples in the Sta
6850: 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 61  t4Accum object a
6860: 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65  bout the.** inde
6870: 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  x being analyzed
6880: 2e 20 20 54 68 65 20 73 74 61 74 5f 67 65 74 28  .  The stat_get(
6890: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77  ) SQL function w
68a0: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 75 73 65  ill later be use
68b0: 64 20 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74 20  d to.** extract 
68c0: 72 65 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d 61  relevant informa
68d0: 74 69 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72 75  tion for constru
68e0: 63 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  cting the sqlite
68f0: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
6900: 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61 6d  *.** The R param
6910: 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73 65  eter is only use
6920: 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20  d for STAT3 and 
6930: 53 54 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63 20  STAT4.*/.static 
6940: 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a 20  void statPush(. 
6950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6960: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6970: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6980: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6990: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
69a0: 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74 69  The three functi
69b0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
69c0: 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20    Stat4Accum *p 
69d0: 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73  = (Stat4Accum*)s
69e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
69f0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  b(argv[0]);.  in
6a00: 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74 65  t iChng = sqlite
6a10: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
6a20: 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  [1]);..  UNUSED_
6a30: 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63 20  PARAMETER( argc 
6a40: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
6a50: 4d 45 54 45 52 28 20 63 6f 6e 74 65 78 74 20 29  METER( context )
6a60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
6a70: 43 6f 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Col>0 );.  asser
6a80: 74 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f 6c  t( iChng<p->nCol
6a90: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52   );..  if( p->nR
6aa0: 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ow==0 ){.    /* 
6ab0: 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  This is the firs
6ac0: 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  t call to this f
6ad0: 75 6e 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69 74  unction. Do init
6ae0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ialization. */. 
6af0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6b00: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e 63  >nCol; i++) p->c
6b10: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d  urrent.anEq[i] =
6b20: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
6b30: 20 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20 73   /* Second and s
6b40: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6b50: 67 65 74 20 70 72 6f 63 65 73 73 65 64 20 68 65  get processed he
6b60: 72 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c 65  re */.    sample
6b70: 50 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c 20  PushPrevious(p, 
6b80: 69 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  iChng);..    /* 
6b90: 55 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c 20  Update anDLt[], 
6ba0: 61 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71 5b  anLt[] and anEq[
6bb0: 5d 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  ] to reflect the
6bc0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 70 70   values that app
6bd0: 6c 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ly.    ** to the
6be0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
6bf0: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  the index. */.  
6c00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43 68    for(i=0; i<iCh
6c10: 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ng; i++){.      
6c20: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6c30: 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]++;.    }.    
6c40: 66 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c 70  for(i=iChng; i<p
6c50: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
6c60: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61      p->current.a
6c70: 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64 65  nDLt[i]++;.#ifde
6c80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6c90: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
6ca0: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
6cb0: 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63 75  anLt[i] += p->cu
6cc0: 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a 23  rrent.anEq[i];.#
6cd0: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 63  endif.      p->c
6ce0: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d  urrent.anEq[i] =
6cf0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
6d00: 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64 65  p->nRow++;.#ifde
6d10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6d20: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
6d30: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
6d40: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29  ue_type(argv[2])
6d50: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
6d60: 20 29 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53 65   ){.    sampleSe
6d70: 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e 64  tRowidInt64(p->d
6d80: 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  b, &p->current, 
6d90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6da0: 74 36 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20  t64(argv[2]));. 
6db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
6dc0: 6c 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64 62  leSetRowid(p->db
6dd0: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73  , &p->current, s
6de0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6df0: 65 73 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20  es(argv[2]),.   
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6e30: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29 29  e_blob(argv[2]))
6e40: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72 65  ;.  }.  p->curre
6e50: 6e 74 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69 50  nt.iHash = p->iP
6e60: 72 6e 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30  rn = p->iPrn*110
6e70: 33 35 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b  3515245 + 12345;
6e80: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
6e90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
6ea0: 41 54 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f 77  AT4.  {.    tRow
6eb0: 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72  cnt nLt = p->cur
6ec0: 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f  rent.anLt[p->nCo
6ed0: 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  l-1];..    /* Ch
6ee0: 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74  eck if this is t
6ef0: 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63 20  o be a periodic 
6f00: 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61  sample. If so, a
6f10: 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  dd it. */.    if
6f20: 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70  ( (nLt/p->nPSamp
6f30: 6c 65 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d 3e  le)!=(nLt+1)/p->
6f40: 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  nPSample ){.    
6f50: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50    p->current.isP
6f60: 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20  Sample = 1;.    
6f70: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f    p->current.iCo
6f80: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 61 6d  l = 0;.      sam
6f90: 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d  pleInsert(p, &p-
6fa0: 3e 63 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43 6f  >current, p->nCo
6fb0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63  l-1);.      p->c
6fc0: 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65  urrent.isPSample
6fd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
6fe0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
6ff0: 42 65 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f  Best[] array. */
7000: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7010: 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b  (p->nCol-1); i++
7020: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
7030: 65 6e 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20  ent.iCol = i;.  
7040: 20 20 20 20 69 66 28 20 69 3e 3d 69 43 68 6e 67      if( i>=iChng
7050: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
7060: 65 72 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63 75  erPost(p, &p->cu
7070: 72 72 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73 74  rrent, &p->aBest
7080: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
7090: 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26 70  sampleCopy(p, &p
70a0: 2d 3e 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d 3e  ->aBest[i], &p->
70b0: 63 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  current);.      
70c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
70d0: 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73  if.}.static cons
70e0: 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 50 75  t FuncDef statPu
70f0: 73 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20  shFuncdef = {.  
7100: 32 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20  2+IsStat34,     
7110: 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51   /* nArg */.  SQ
7120: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f  LITE_UTF8,     /
7130: 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20  * funcFlags */. 
7140: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7150: 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a    /* pUserData *
7160: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
7170: 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
7180: 0a 20 20 73 74 61 74 50 75 73 68 2c 20 20 20 20  .  statPush,    
7190: 20 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f      /* xSFunc */
71a0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
71b0: 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65      /* xFinalize
71c0: 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20   */.  0, 0,     
71d0: 20 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65         /* xValue
71e0: 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20  , xInverse */.  
71f0: 22 73 74 61 74 5f 70 75 73 68 22 2c 20 20 20 20  "stat_push",    
7200: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b   /* zName */.  {
7210: 30 7d 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53  0}.};..#define S
7220: 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 30 20  TAT_GET_STAT1 0 
7230: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 74 61           /* "sta
7240: 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61  t" column of sta
7250: 74 31 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  t1 table */.#def
7260: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 52 4f 57  ine STAT_GET_ROW
7270: 49 44 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a  ID 1          /*
7280: 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20   "rowid" column 
7290: 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72  of stat[34] entr
72a0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41  y */.#define STA
72b0: 54 5f 47 45 54 5f 4e 45 51 20 20 20 32 20 20 20  T_GET_NEQ   2   
72c0: 20 20 20 20 20 20 20 2f 2a 20 22 6e 65 71 22 20         /* "neq" 
72d0: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
72e0: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
72f0: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54  ine STAT_GET_NLT
7300: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 2f 2a     3          /*
7310: 20 22 6e 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66   "nlt" column of
7320: 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20   stat[34] entry 
7330: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
7340: 47 45 54 5f 4e 44 4c 54 20 20 34 20 20 20 20 20  GET_NDLT  4     
7350: 20 20 20 20 20 2f 2a 20 22 6e 64 6c 74 22 20 63       /* "ndlt" c
7360: 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34  olumn of stat[34
7370: 5d 20 65 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a  ] entry */../*.*
7380: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
7390: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 67 65 74   of the stat_get
73a0: 28 50 2c 4a 29 20 53 51 4c 20 66 75 6e 63 74 69  (P,J) SQL functi
73b0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
73c0: 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  e is.** used to 
73d0: 71 75 65 72 79 20 73 74 61 74 69 73 74 69 63 61  query statistica
73e0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  l information th
73f0: 61 74 20 68 61 73 20 62 65 65 6e 20 67 61 74 68  at has been gath
7400: 65 72 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  ered into.** the
7410: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
7420: 63 74 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c  ct by prior call
7430: 73 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28 29  s to stat_push()
7440: 2e 20 20 54 68 65 20 50 20 70 61 72 61 6d 65 74  .  The P paramet
7450: 65 72 0a 2a 2a 20 68 61 73 20 74 79 70 65 20 42  er.** has type B
7460: 4c 4f 42 20 62 75 74 20 69 74 20 69 73 20 72 65  LOB but it is re
7470: 61 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69 6e  ally just a poin
7480: 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74 34  ter to the Stat4
7490: 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Accum object..**
74a0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20   The content to 
74b0: 72 65 74 75 72 6e 65 64 20 69 73 20 64 65 74 65  returned is dete
74c0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  rmined by the pa
74d0: 72 61 6d 65 74 65 72 20 4a 0a 2a 2a 20 77 68 69  rameter J.** whi
74e0: 63 68 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  ch is one of the
74f0: 20 53 54 41 54 5f 47 45 54 5f 78 78 78 78 20 76   STAT_GET_xxxx v
7500: 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 61 62  alues defined ab
7510: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ove..**.** The s
7520: 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 66 75 6e  tat_get(P,J) fun
7530: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61  ction is not ava
7540: 69 6c 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 69  ilable to generi
7550: 63 20 53 51 4c 2e 20 20 49 74 20 69 73 0a 2a 2a  c SQL.  It is.**
7560: 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72   inserted as par
7570: 74 20 6f 66 20 61 20 6d 61 6e 75 61 6c 6c 79 20  t of a manually 
7580: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 74 65  constructed byte
7590: 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20 20 28  code program.  (
75a0: 53 65 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 53  See.** the callS
75b0: 74 61 74 47 65 74 28 29 20 72 6f 75 74 69 6e 65  tatGet() routine
75c0: 20 62 65 6c 6f 77 2e 29 20 20 49 74 20 69 73 20   below.)  It is 
75d0: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
75e0: 74 68 65 20 50 0a 2a 2a 20 70 61 72 61 6d 65 74  the P.** paramet
75f0: 65 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  er will always b
7600: 65 20 61 20 70 6f 69 6e 65 72 20 74 6f 20 61 20  e a poiner to a 
7610: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
7620: 74 2c 20 6e 65 76 65 72 20 61 0a 2a 2a 20 4e 55  t, never a.** NU
7630: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  LL..**.** If nei
7640: 74 68 65 72 20 53 54 41 54 33 20 6e 6f 72 20 53  ther STAT3 nor S
7650: 54 41 54 34 20 61 72 65 20 65 6e 61 62 6c 65 64  TAT4 are enabled
7660: 2c 20 74 68 65 6e 20 4a 20 69 73 20 61 6c 77 61  , then J is alwa
7670: 79 73 0a 2a 2a 20 53 54 41 54 5f 47 45 54 5f 53  ys.** STAT_GET_S
7680: 54 41 54 31 20 61 6e 64 20 69 73 20 68 65 6e 63  TAT1 and is henc
7690: 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  e omitted and th
76a0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d  is routine becom
76b0: 65 73 0a 2a 2a 20 61 20 6f 6e 65 2d 70 61 72 61  es.** a one-para
76c0: 6d 65 74 65 72 20 66 75 6e 63 74 69 6f 6e 2c 20  meter function, 
76d0: 73 74 61 74 5f 67 65 74 28 50 29 2c 20 74 68 61  stat_get(P), tha
76e0: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
76f0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 31 20 74 61   the.** stat1 ta
7700: 62 6c 65 20 65 6e 74 72 79 20 69 6e 66 6f 72 6d  ble entry inform
7710: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
7720: 20 76 6f 69 64 20 73 74 61 74 47 65 74 28 0a 20   void statGet(. 
7730: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7740: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7750: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7760: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7770: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
7780: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
7790: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
77a0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  ob(argv[0]);.#if
77b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
77c0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
77d0: 0a 20 20 2f 2a 20 53 54 41 54 33 20 61 6e 64 20  .  /* STAT3 and 
77e0: 53 54 41 54 34 20 68 61 76 65 20 61 20 70 61 72  STAT4 have a par
77f0: 61 6d 65 74 65 72 20 6f 6e 20 74 68 69 73 20 72  ameter on this r
7800: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e 74  outine. */.  int
7810: 20 65 43 61 6c 6c 20 3d 20 73 71 6c 69 74 65 33   eCall = sqlite3
7820: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7830: 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  1]);.  assert( a
7840: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  rgc==2 );.  asse
7850: 72 74 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f  rt( eCall==STAT_
7860: 47 45 54 5f 53 54 41 54 31 20 7c 7c 20 65 43 61  GET_STAT1 || eCa
7870: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 45 51  ll==STAT_GET_NEQ
7880: 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61 6c   .       || eCal
7890: 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49  l==STAT_GET_ROWI
78a0: 44 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54  D || eCall==STAT
78b0: 5f 47 45 54 5f 4e 4c 54 0a 20 20 20 20 20 20 20  _GET_NLT.       
78c0: 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47  || eCall==STAT_G
78d0: 45 54 5f 4e 44 4c 54 20 0a 20 20 29 3b 0a 20 20  ET_NDLT .  );.  
78e0: 69 66 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f  if( eCall==STAT_
78f0: 47 45 54 5f 53 54 41 54 31 20 29 0a 23 65 6c 73  GET_STAT1 ).#els
7900: 65 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  e.  assert( argc
7910: 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==1 );.#endif.  
7920: 7b 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  {.    /* Return 
7930: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  the value to sto
7940: 72 65 20 69 6e 20 74 68 65 20 22 73 74 61 74 22  re in the "stat"
7950: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
7960: 71 6c 69 74 65 5f 73 74 61 74 31 0a 20 20 20 20  qlite_stat1.    
7970: 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69  ** table for thi
7980: 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  s index..    **.
7990: 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
79a0: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6d   is a string com
79b0: 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74 20  posed of a list 
79c0: 6f 66 20 69 6e 74 65 67 65 72 73 20 64 65 73 63  of integers desc
79d0: 72 69 62 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74  ribing .    ** t
79e0: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 20 66 69  he index. The fi
79f0: 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74  rst integer in t
7a00: 68 65 20 6c 69 73 74 20 69 73 20 74 68 65 20 74  he list is the t
7a10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a  otal number of .
7a20: 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 69      ** entries i
7a30: 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65  n the index. The
7a40: 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74 69  re is one additi
7a50: 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e 20  onal integer in 
7a60: 74 68 65 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a  the list .    **
7a70: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
7a80: 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 61  d column. This a
7a90: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
7aa0: 72 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  r is an estimate
7ab0: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e   of.    ** the n
7ac0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 61  umber of rows ma
7ad0: 74 63 68 65 64 20 62 79 20 61 20 73 74 61 62 62  tched by a stabb
7ae0: 69 6e 67 20 71 75 65 72 79 20 6f 6e 20 74 68 65  ing query on the
7af0: 20 69 6e 64 65 78 20 75 73 69 6e 67 0a 20 20 20   index using.   
7b00: 20 2a 2a 20 61 20 6b 65 79 20 77 69 74 68 20 74   ** a key with t
7b10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7b20: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
7b30: 73 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  s. In other word
7b40: 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s,.    ** if the
7b50: 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 63 6f 6c   index is on col
7b60: 75 6d 6e 73 20 28 61 2c 62 29 20 61 6e 64 20 74  umns (a,b) and t
7b70: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
7b80: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 2a 2a  value is .    **
7b90: 20 22 31 30 30 20 31 30 20 32 22 2c 20 74 68 65   "100 10 2", the
7ba0: 6e 20 53 51 4c 69 74 65 20 65 73 74 69 6d 61 74  n SQLite estimat
7bb0: 65 73 20 74 68 61 74 3a 0a 20 20 20 20 2a 2a 0a  es that:.    **.
7bc0: 20 20 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 69      **   * the i
7bd0: 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 31 30  ndex contains 10
7be0: 30 20 72 6f 77 73 2c 0a 20 20 20 20 2a 2a 20 20  0 rows,.    **  
7bf0: 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 22 20 6d   * "WHERE a=?" m
7c00: 61 74 63 68 65 73 20 31 30 20 72 6f 77 73 2c 20  atches 10 rows, 
7c10: 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22  and.    **   * "
7c20: 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d  WHERE a=? AND b=
7c30: 3f 22 20 6d 61 74 63 68 65 73 20 32 20 72 6f 77  ?" matches 2 row
7c40: 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
7c50: 20 49 66 20 44 20 69 73 20 74 68 65 20 63 6f 75   If D is the cou
7c60: 6e 74 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76  nt of distinct v
7c70: 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20 74  alues and K is t
7c80: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
7c90: 6f 66 20 0a 20 20 20 20 2a 2a 20 72 6f 77 73 2c  of .    ** rows,
7ca0: 20 74 68 65 6e 20 65 61 63 68 20 65 73 74 69 6d   then each estim
7cb0: 61 74 65 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ate is computed 
7cc0: 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  as:.    **.    *
7cd0: 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b 2b  *        I = (K+
7ce0: 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2f 0a 20 20  D-1)/D.    */.  
7cf0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
7d00: 6e 74 20 69 3b 0a 0a 20 20 20 20 63 68 61 72 20  nt i;..    char 
7d10: 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zRet = sqlite3M
7d20: 61 6c 6c 6f 63 5a 65 72 6f 28 20 28 70 2d 3e 6e  allocZero( (p->n
7d30: 4b 65 79 43 6f 6c 2b 31 29 2a 32 35 20 29 3b 0a  KeyCol+1)*25 );.
7d40: 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
7d50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
7d70: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
7d80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7d90: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  }..    sqlite3_s
7da0: 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65 74  nprintf(24, zRet
7db0: 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29 70  , "%llu", (u64)p
7dc0: 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  ->nRow);.    z =
7dd0: 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33 53   zRet + sqlite3S
7de0: 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a 20  trlen30(zRet);. 
7df0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7e00: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
7e10: 20 20 20 20 20 20 75 36 34 20 6e 44 69 73 74 69        u64 nDisti
7e20: 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74  nct = p->current
7e30: 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a 20  .anDLt[i] + 1;. 
7e40: 20 20 20 20 20 75 36 34 20 69 56 61 6c 20 3d 20       u64 iVal = 
7e50: 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69 73 74  (p->nRow + nDist
7e60: 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44 69 73  inct - 1) / nDis
7e70: 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  tinct;.      sql
7e80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 34  ite3_snprintf(24
7e90: 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20 69 56  , z, " %llu", iV
7ea0: 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  al);.      z += 
7eb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7ec0: 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  z);.      assert
7ed0: 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  ( p->current.anE
7ee0: 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  q[i] );.    }.  
7ef0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
7f00: 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20 29  '\0' && z>zRet )
7f10: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ;..    sqlite3_r
7f20: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7f30: 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71  xt, zRet, -1, sq
7f40: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
7f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7f60: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
7f70: 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66 28 20  TAT4.  else if( 
7f80: 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f  eCall==STAT_GET_
7f90: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69 66 28  ROWID ){.    if(
7fa0: 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a 20 20   p->iGet<0 ){.  
7fb0: 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68 50 72      samplePushPr
7fc0: 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a 20 20  evious(p, 0);.  
7fd0: 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20 30 3b      p->iGet = 0;
7fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7ff0: 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c  ->iGet<p->nSampl
8000: 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34  e ){.      Stat4
8010: 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70 2d 3e  Sample *pS = p->
8020: 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20 20 20  a + p->iGet;.   
8030: 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f 77 69     if( pS->nRowi
8040: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
8050: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8060: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 53  nt64(context, pS
8070: 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20  ->u.iRowid);.   
8080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8090: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
80a0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70  _blob(context, p
80b0: 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 53 2d  S->u.aRowid, pS-
80c0: 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  >nRowid,.       
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
80f0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
8100: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8110: 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43 6e 74     tRowcnt *aCnt
8120: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
8130: 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53  t( p->iGet<p->nS
8140: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73 77 69  ample );.    swi
8150: 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a 20 20  tch( eCall ){.  
8160: 20 20 20 20 63 61 73 65 20 53 54 41 54 5f 47 45      case STAT_GE
8170: 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d 20 70  T_NEQ:  aCnt = p
8180: 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 45  ->a[p->iGet].anE
8190: 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  q; break;.      
81a0: 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c  case STAT_GET_NL
81b0: 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b  T:  aCnt = p->a[
81c0: 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b 20 62  p->iGet].anLt; b
81d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
81e0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
81f0: 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47  Cnt = p->a[p->iG
8200: 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20 20 20  et].anDLt; .    
8210: 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a 20      p->iGet++;. 
8220: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8240: 20 69 66 28 20 49 73 53 74 61 74 33 20 29 7b 0a   if( IsStat3 ){.
8250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8260: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
8270: 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b 30 5d  xt, (i64)aCnt[0]
8280: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8290: 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d      char *zRet =
82a0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
82b0: 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29  ro(p->nCol * 25)
82c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74  ;.      if( zRet
82d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
82e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
82f0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
8300: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
8310: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
8320: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
8330: 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20 20  = zRet;.        
8340: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8350: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8360: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8370: 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c  intf(24, z, "%ll
8380: 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74 5b 69  u ", (u64)aCnt[i
8390: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 20  ]);.          z 
83a0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
83b0: 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  30(z);.        }
83c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
83d0: 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a   z[0]=='\0' && z
83e0: 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20 20 20  >zRet );.       
83f0: 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20   z[-1] = '\0';. 
8400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
8410: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
8420: 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71  xt, zRet, -1, sq
8430: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
8440: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
8450: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8460: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
8470: 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64 65 66  STAT4 */.#ifndef
8480: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8490: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
84a0: 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64 69 66  ( argc );.#endif
84b0: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
84c0: 46 75 6e 63 44 65 66 20 73 74 61 74 47 65 74 46  FuncDef statGetF
84d0: 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49  uncdef = {.  1+I
84e0: 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a  sStat34,      /*
84f0: 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54   nArg */.  SQLIT
8500: 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66  E_UTF8,     /* f
8510: 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c  uncFlags */.  0,
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8530: 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20  * pUserData */. 
8540: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
8550: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
8560: 73 74 61 74 47 65 74 2c 20 20 20 20 20 20 20 20  statGet,        
8570: 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20   /* xSFunc */.  
8580: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8590: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
85a0: 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  .  0, 0,        
85b0: 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20 78      /* xValue, x
85c0: 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73 74  Inverse */.  "st
85d0: 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f 2a  at_get",      /*
85e0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
85f0: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
8600: 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62 65  callStatGet(Vdbe
8610: 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61 74   *v, int regStat
8620: 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20 69  4, int iParam, i
8630: 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61 73  nt regOut){.  as
8640: 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72 65  sert( regOut!=re
8650: 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75 74  gStat4 && regOut
8660: 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b 0a  !=regStat4+1 );.
8670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8680: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
8690: 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62  AT4.  sqlite3Vdb
86a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
86b0: 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72  teger, iParam, r
86c0: 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 69  egStat4+1);.#eli
86d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
86e0: 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d 3d   assert( iParam=
86f0: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
8700: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
8710: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50 61  D_PARAMETER( iPa
8720: 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ram );.#endif.  
8730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8740: 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
8750: 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c 20  0, 0, regStat4, 
8760: 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  regOut,.        
8770: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
8780: 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63 64  r*)&statGetFuncd
8790: 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
87a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
87b0: 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49 73  angeP5(v, 1 + Is
87c0: 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat34);.}../*.*
87d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
87e0: 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  to do an analysi
87f0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
8800: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8810: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
8820: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
8830: 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62  id analyzeOneTab
8840: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
8850: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
8860: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
8870: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
8880: 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e  * Table whose in
8890: 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65 20  dices are to be 
88a0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
88b0: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f  dex *pOnlyIdx, /
88c0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f  * If not NULL, o
88d0: 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69 73  nly analyze this
88e0: 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   one index */.  
88f0: 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20 20  int iStatCur,   
8900: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62   /* Index of Vdb
8910: 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72 69  eCursor that wri
8920: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
8930: 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
8940: 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20 20  int iMem,       
8950: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
8960: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62  mory locations b
8970: 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  egin here */.  i
8980: 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20 20  nt iTab         
8990: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
89a0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  e cursor */.){. 
89b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
89c0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a  Parse->db;    /*
89d0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
89e0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
89f0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
8a00: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74     /* An index t
8a10: 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  o being analyzed
8a20: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
8a30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8a40: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
8a50: 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e 67  n on index being
8a60: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69   analyzed */.  i
8a70: 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8a90: 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  able cursor */. 
8aa0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ac0: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
8ad0: 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c 74  hine being built
8ae0: 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20   up */.  int i; 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8b10: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  unter */.  int j
8b20: 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20  ZeroRows = -1;  
8b30: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
8b40: 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75 6d  from here if num
8b50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20 7a  ber of rows is z
8b60: 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ero */.  int iDb
8b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8b90: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
8ba0: 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20  ining pTab */.  
8bb0: 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20  u8 needTableCnt 
8bc0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 1;         /* 
8bd0: 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74 68  True to count th
8be0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
8bf0: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 69   regNewRowid = i
8c00: 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77  Mem++;    /* Row
8c10: 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72  id for the inser
8c20: 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ted record */.  
8c30: 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20 69  int regStat4 = i
8c40: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8c50: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
8c60: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
8c70: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ct */.  int regC
8c80: 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  hng = iMem++;   
8c90: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8ca0: 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20 66   changed index f
8cb0: 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  ield */.#ifdef S
8cc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8cd0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e  T3_OR_STAT4.  in
8ce0: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d 65  t regRowid = iMe
8cf0: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  m++;       /* Ro
8d00: 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  wid argument pas
8d10: 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73 68  sed to stat_push
8d20: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
8d30: 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d 65  nt regTemp = iMe
8d40: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  m++;        /* T
8d50: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
8d60: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
8d70: 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d  egTabname = iMem
8d80: 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ++;     /* Regis
8d90: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
8da0: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  able name */.  i
8db0: 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d 20  nt regIdxname = 
8dc0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
8dd0: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
8de0: 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  ng index name */
8df0: 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31 20  .  int regStat1 
8e00: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
8e10: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68 65  /* Value for the
8e20: 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   stat column of 
8e30: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a  sqlite_stat1 */.
8e40: 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d 20    int regPrev = 
8e50: 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  iMem;          /
8e60: 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20 28  * MUST BE LAST (
8e70: 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23 69  see below) */.#i
8e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8e90: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
8ea0: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 53 74 61 74  K.  Table *pStat
8eb0: 31 20 3d 20 30 3b 20 0a 23 65 6e 64 69 66 0a 0a  1 = 0; .#endif..
8ec0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8ed0: 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65   MAX(pParse->nMe
8ee0: 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d 20  m, iMem);.  v = 
8ef0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8f00: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
8f10: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61 62  =0 || NEVER(pTab
8f20: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
8f30: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  rn;.  }.  if( pT
8f40: 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20  ab->tnum==0 ){. 
8f50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74     /* Do not gat
8f60: 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f  her statistics o
8f70: 6e 20 76 69 65 77 73 20 6f 72 20 76 69 72 74 75  n views or virtu
8f80: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  al tables */.   
8f90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8fa0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
8fb0: 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22 2c  ke("sqlite\\_%",
8fc0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 27 5c   pTab->zName, '\
8fd0: 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  \')==0 ){.    /*
8fe0: 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73   Do not gather s
8ff0: 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79 73  tatistics on sys
9000: 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  tem tables */.  
9010: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9020: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
9030: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
9040: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44 62  xes(db) );.  iDb
9050: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
9060: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
9070: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
9080: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a  sert( iDb>=0 );.
9090: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
90a0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
90b0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
90c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
90d0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
90e0: 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
90f0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
9100: 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c   SQLITE_ANALYZE,
9110: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
9120: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
9130: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29  Db].zDbSName ) )
9140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
9150: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
9160: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
9170: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
9180: 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61  if( db->xPreUpda
9190: 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  teCallback ){.  
91a0: 20 20 70 53 74 61 74 31 20 3d 20 28 54 61 62 6c    pStat1 = (Tabl
91b0: 65 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  e*)sqlite3DbMall
91c0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
91d0: 66 28 54 61 62 6c 65 29 20 2b 20 31 33 29 3b 0a  f(Table) + 13);.
91e0: 20 20 20 20 69 66 28 20 70 53 74 61 74 31 3d 3d      if( pStat1==
91f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
9200: 70 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d 20  pStat1->zName = 
9210: 28 63 68 61 72 2a 29 26 70 53 74 61 74 31 5b 31  (char*)&pStat1[1
9220: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53  ];.    memcpy(pS
9230: 74 61 74 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  tat1->zName, "sq
9240: 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 31 33 29  lite_stat1", 13)
9250: 3b 0a 20 20 20 20 70 53 74 61 74 31 2d 3e 6e 43  ;.    pStat1->nC
9260: 6f 6c 20 3d 20 33 3b 0a 20 20 20 20 70 53 74 61  ol = 3;.    pSta
9270: 74 31 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  t1->iPKey = -1;.
9280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9290: 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56  ddOp4(pParse->pV
92a0: 64 62 65 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  dbe, OP_Noop, 0,
92b0: 20 30 2c 20 30 2c 28 63 68 61 72 2a 29 70 53 74   0, 0,(char*)pSt
92c0: 61 74 31 2c 50 34 5f 44 59 4e 42 4c 4f 42 29 3b  at1,P4_DYNBLOB);
92d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
92e0: 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72 65  * Establish a re
92f0: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  ad-lock on the t
9300: 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61 72  able at the shar
9310: 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20  ed-cache level. 
9320: 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61  .  ** Open a rea
9330: 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e  d-only cursor on
9340: 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73 6f   the table. Also
9350: 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72 73   allocate a curs
9360: 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 74  or number.  ** t
9370: 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e 69  o use for scanni
9380: 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64 78  ng indexes (iIdx
9390: 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20 63  Cur). No index c
93a0: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
93b0: 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69 6d  at.  ** this tim
93c0: 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20 20  e though.  */.  
93d0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
93e0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
93f0: 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
9400: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54 61  b->zName);.  iTa
9410: 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20  bCur = iTab++;. 
9420: 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62 2b   iIdxCur = iTab+
9430: 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  +;.  pParse->nTa
9440: 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e  b = MAX(pParse->
9450: 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20 73  nTab, iTab);.  s
9460: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
9470: 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c  pParse, iTabCur,
9480: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
9490: 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c 69  penRead);.  sqli
94a0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
94b0: 67 28 76 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  g(v, regTabname,
94c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
94d0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
94e0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
94f0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
9500: 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  {.    int nCol; 
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9530: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64 78   columns in pIdx
9540: 2e 20 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e 74  . "N" */.    int
9550: 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20 20   addrRewind;    
9560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9570: 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65 77  dress of "OP_Rew
9580: 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f 0a  ind iIdxCur" */.
9590: 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
95a0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
95b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
95c0: 22 6e 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a 20  "next_row:" */. 
95d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
95e0: 49 64 78 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  IdxName;        
95f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
9600: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
9610: 20 6e 43 6f 6c 54 65 73 74 3b 20 20 20 20 20 20   nColTest;      
9620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9630: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9640: 74 6f 20 74 65 73 74 20 66 6f 72 20 63 68 61 6e  to test for chan
9650: 67 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ges */..    if( 
9660: 70 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c  pOnlyIdx && pOnl
9670: 79 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f 6e  yIdx!=pIdx ) con
9680: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
9690: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
96a0: 72 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62 6c  re==0 ) needTabl
96b0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  eCnt = 0;.    if
96c0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
96d0: 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
96e0: 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a  yIndex(pIdx) ){.
96f0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64        nCol = pId
9700: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
9710: 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54 61    zIdxName = pTa
9720: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
9730: 6e 43 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c 20  nColTest = nCol 
9740: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
9750: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64        nCol = pId
9760: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
9770: 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49 64    zIdxName = pId
9780: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
9790: 6e 43 6f 6c 54 65 73 74 20 3d 20 70 49 64 78 2d  nColTest = pIdx-
97a0: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70  >uniqNotNull ? p
97b0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 3a  Idx->nKeyCol-1 :
97c0: 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a 0a   nCol-1;.    }..
97d0: 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
97e0: 74 68 65 20 72 65 67 69 73 74 65 72 20 63 6f 6e  the register con
97f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
9800: 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73  x name. */.    s
9810: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
9820: 72 69 6e 67 28 76 2c 20 72 65 67 49 64 78 6e 61  ring(v, regIdxna
9830: 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  me, zIdxName);. 
9840: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
9850: 76 2c 20 22 41 6e 61 6c 79 73 69 73 20 66 6f 72  v, "Analysis for
9860: 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a   %s.%s", pTab->z
9870: 4e 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 29  Name, zIdxName))
9880: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
9890: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72   Pseudo-code for
98a0: 20 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c 73   loop that calls
98b0: 20 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20 20   stat_push():.  
98c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65    **.    **   Re
98d0: 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20  wind csr.    ** 
98e0: 20 20 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f    if eof(csr) go
98f0: 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a  to end_of_scan;.
9900: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9910: 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f   = 0.    **   go
9920: 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a  to chng_addr_0;.
9930: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e      **.    **  n
9940: 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20  ext_row:.    ** 
9950: 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20    regChng = 0.  
9960: 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30    **   if( idx(0
9970: 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20  ) != regPrev(0) 
9980: 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72  ) goto chng_addr
9990: 5f 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43  _0.    **   regC
99a0: 68 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20  hng = 1.    **  
99b0: 20 69 66 28 20 69 64 78 28 31 29 20 21 3d 20 72   if( idx(1) != r
99c0: 65 67 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f  egPrev(1) ) goto
99d0: 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20   chng_addr_1.   
99e0: 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a   **   ....    **
99f0: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20     regChng = N. 
9a00: 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e     **   goto chn
9a10: 67 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a  g_addr_N.    **.
9a20: 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64      **  chng_add
9a30: 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65  r_0:.    **   re
9a40: 67 50 72 65 76 28 30 29 20 3d 20 69 64 78 28 30  gPrev(0) = idx(0
9a50: 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61  ).    **  chng_a
9a60: 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20  ddr_1:.    **   
9a70: 72 65 67 50 72 65 76 28 31 29 20 3d 20 69 64 78  regPrev(1) = idx
9a80: 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a  (1).    **  ....
9a90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65      **.    **  e
9aa0: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 3a 0a  ndDistinctTest:.
9ab0: 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69      **   regRowi
9ac0: 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 0a 20  d = idx(rowid). 
9ad0: 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75 73     **   stat_pus
9ae0: 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72 65  h(P, regChng, re
9af0: 67 52 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20  gRowid).    **  
9b00: 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a 2a   Next csr.    **
9b10: 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29 20     if !eof(csr) 
9b20: 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20  goto next_row;. 
9b30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e     **.    **  en
9b40: 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20 2a  d_of_scan:.    *
9b50: 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
9b60: 75 72 65 20 74 68 65 72 65 20 61 72 65 20 65 6e  ure there are en
9b70: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ough memory cell
9b80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61  s allocated to a
9b90: 63 63 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20 20  ccommodate .    
9ba0: 2a 2a 20 74 68 65 20 72 65 67 50 72 65 76 20 61  ** the regPrev a
9bb0: 72 72 61 79 20 61 6e 64 20 61 20 74 72 61 69 6c  rray and a trail
9bc0: 69 6e 67 20 72 6f 77 69 64 20 28 74 68 65 20 72  ing rowid (the r
9bd0: 6f 77 69 64 20 73 6c 6f 74 20 69 73 20 72 65 71  owid slot is req
9be0: 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 77 68 65  uired.    ** whe
9bf0: 6e 20 62 75 69 6c 64 69 6e 67 20 61 20 72 65 63  n building a rec
9c00: 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ord to insert in
9c10: 74 6f 20 74 68 65 20 73 61 6d 70 6c 65 20 63 6f  to the sample co
9c20: 6c 75 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a 20  lumn of .    ** 
9c30: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
9c40: 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
9c50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d  pParse->nMem = M
9c60: 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  AX(pParse->nMem,
9c70: 20 72 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65 73   regPrev+nColTes
9c80: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  t);..    /* Open
9c90: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
9ca0: 73 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  sor on the index
9cb0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e   being analyzed.
9cc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9cd0: 69 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65  iDb==sqlite3Sche
9ce0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
9cf0: 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  dx->pSchema) );.
9d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9d10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
9d20: 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
9d30: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
9d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9d50: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
9d60: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
9d70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
9d80: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
9d90: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76  e));..    /* Inv
9da0: 6f 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e 69  oke the stat_ini
9db0: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  t() function. Th
9dc0: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 3a  e arguments are:
9dd0: 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
9de0: 20 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62 65     (1) the numbe
9df0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9e00: 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75 64  the index includ
9e10: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20  ing the rowid.  
9e20: 20 20 2a 2a 20 20 20 20 20 20 20 20 28 6f 72 20    **        (or 
9e30: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
9e40: 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  WID table, the n
9e50: 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75  umber of PK colu
9e60: 6d 6e 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20 20  mns),.    **    
9e70: 28 32 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  (2) the number o
9e80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9e90: 20 6b 65 79 20 77 69 74 68 6f 75 74 20 74 68 65   key without the
9ea0: 20 72 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a 2a   rowid/pk.    **
9eb0: 20 20 20 20 28 33 29 20 74 68 65 20 6e 75 6d 62      (3) the numb
9ec0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
9ed0: 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 0a  e index,.    **.
9ee0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
9ef0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
9f00: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
9f10: 72 20 53 54 41 54 33 20 61 6e 64 20 53 54 41 54  r STAT3 and STAT
9f20: 34 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20  4.    */.#ifdef 
9f30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9f40: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f60: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
9f70: 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61 74  iIdxCur, regStat
9f80: 34 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  4+3);.#endif.   
9f90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9fa0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
9fb0: 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74 34  , nCol, regStat4
9fc0: 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
9fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9fe0: 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
9ff0: 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61 74  nKeyCol, regStat
a000: 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+2);.    sqlite
a010: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a020: 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c 20  P_Function0, 0, 
a030: 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67 53  regStat4+1, regS
a040: 74 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20 20  tat4,.          
a050: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
a060: 2a 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63 64  *)&statInitFuncd
a070: 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
a080: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a090: 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49 73  ChangeP5(v, 2+Is
a0a0: 53 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f 2a  Stat34);..    /*
a0b0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
a0c0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
a0d0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
a0e0: 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20    Rewind csr.   
a0f0: 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72   **   if eof(csr
a100: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63  ) goto end_of_sc
a110: 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  an;.    **   reg
a120: 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20  Chng = 0.    ** 
a130: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68    goto next_push
a140: 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  _0;.    **.    *
a150: 2f 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e 64  /.    addrRewind
a160: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a170: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
a180: 64 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20  d, iIdxCur);.   
a190: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a1a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a1b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
a1c0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68 6e  teger, 0, regChn
a1d0: 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78 74  g);.    addrNext
a1e0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
a1f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
a200: 0a 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65  ..    if( nColTe
a210: 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  st>0 ){.      in
a220: 74 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73  t endDistinctTes
a230: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
a240: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
a250: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 47 6f  ;.      int *aGo
a260: 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20 20 20  toChng;         
a270: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
a280: 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  f jump instructi
a290: 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  on addresses */.
a2a0: 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67 20        aGotoChng 
a2b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a2c0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
a2d0: 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73 74 29  f(int)*nColTest)
a2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47 6f 74  ;.      if( aGot
a2f0: 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e 74 69  oChng==0 ) conti
a300: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a 20  nue;..      /*. 
a310: 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f       **  next_ro
a320: 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  w:.      **   re
a330: 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 20 20  gChng = 0.      
a340: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20  **   if( idx(0) 
a350: 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20  != regPrev(0) ) 
a360: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30  goto chng_addr_0
a370: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43  .      **   regC
a380: 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20 2a 2a  hng = 1.      **
a390: 20 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d     if( idx(1) !=
a3a0: 20 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f   regPrev(1) ) go
a3b0: 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20  to chng_addr_1. 
a3c0: 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20       **   ....  
a3d0: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
a3e0: 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20 20   = N.      **   
a3f0: 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e 63 74  goto endDistinct
a400: 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  Test.      */.  
a410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a420: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
a430: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  );.      addrNex
a440: 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
a450: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a460: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c  ;.      if( nCol
a470: 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64 78 2d  Test==1 && pIdx-
a480: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49  >nKeyCol==1 && I
a490: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
a4a0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  x) ){.        /*
a4b0: 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d 63 6f   For a single-co
a4c0: 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e 64 65  lumn UNIQUE inde
a4d0: 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76 65 20  x, once we have 
a4e0: 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  found a non-NULL
a4f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 2c  .        ** row,
a500: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 6c   we know that al
a510: 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c 6c 20  l the rest will 
a520: 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73 6f 20  be distinct, so 
a530: 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20 2a 2a  skip .        **
a540: 20 73 75 62 73 65 71 75 65 6e 74 20 64 69 73 74   subsequent dist
a550: 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73 2e 20  inctness tests. 
a560: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
a570: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a580: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 50  OP_NotNull, regP
a590: 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74  rev, endDistinct
a5a0: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 56  Test);.        V
a5b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
a5d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73  r(i=0; i<nColTes
a5e0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
a5f0: 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d 20 28   char *pColl = (
a600: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63  char*)sqlite3Loc
a610: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
a620: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
a630: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
a640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a650: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
a660: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 20   regChng);.     
a670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a680: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a690: 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72  n, iIdxCur, i, r
a6a0: 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 20  egTemp);.       
a6b0: 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d 20   aGotoChng[i] = 
a6c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6d0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a6e0: 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c  _Ne, regTemp, 0,
a6f0: 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43 6f 6c   regPrev+i, pCol
a700: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
a710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a720: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
a730: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
a740: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
a750: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
a760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a770: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
a780: 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73 74 2c  teger, nColTest,
a790: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 20   regChng);.     
a7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
a7b0: 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74 54  (v, endDistinctT
a7c0: 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20 20 20  est);.  .  .    
a7d0: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 63    /*.      **  c
a7e0: 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20  hng_addr_0:.    
a7f0: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30    **   regPrev(0
a800: 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20 20  ) = idx(0).     
a810: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 31   **  chng_addr_1
a820: 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  :.      **   reg
a830: 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31 29  Prev(1) = idx(1)
a840: 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20  .      **  .... 
a850: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
a860: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a870: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52 6f 77  e(v, addrNextRow
a880: 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  -1);.      for(i
a890: 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20  =0; i<nColTest; 
a8a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
a8b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a8c0: 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b 69  e(v, aGotoChng[i
a8d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
a8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a8f0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
a900: 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65 76 2b  Cur, i, regPrev+
a910: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
a920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
a930: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
a940: 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a 20  DistinctTest);. 
a950: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a960: 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68 6e 67  ee(db, aGotoChng
a970: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
a980: 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  /*.    **  chng_
a990: 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20 20  addr_N:.    **  
a9a0: 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78 28   regRowid = idx(
a9b0: 72 6f 77 69 64 29 20 20 20 20 20 20 20 20 20 20  rowid)          
a9c0: 20 20 2f 2f 20 53 54 41 54 33 34 20 6f 6e 6c 79    // STAT34 only
a9d0: 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70  .    **   stat_p
a9e0: 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20  ush(P, regChng, 
a9f0: 72 65 67 52 6f 77 69 64 29 20 20 2f 2f 20 33 72  regRowid)  // 3r
aa00: 64 20 70 61 72 61 6d 65 74 65 72 20 53 54 41 54  d parameter STAT
aa10: 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  34 only.    **  
aa20: 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a 2a   Next csr.    **
aa30: 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29 20     if !eof(csr) 
aa40: 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20  goto next_row;. 
aa50: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
aa60: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
aa70: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 61 73  _OR_STAT4.    as
aa80: 73 65 72 74 28 20 72 65 67 52 6f 77 69 64 3d 3d  sert( regRowid==
aa90: 28 72 65 67 53 74 61 74 34 2b 32 29 20 29 3b 0a  (regStat4+2) );.
aaa0: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
aab0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
aac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aad0: 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
aae0: 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 52 6f  , iIdxCur, regRo
aaf0: 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
ab00: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
ab10: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
ab20: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d  ryKeyIndex(pIdx-
ab30: 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >pTable);.      
ab40: 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b 65 79  int j, k, regKey
ab50: 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79 20 3d  ;.      regKey =
ab60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ab70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b  ange(pParse, pPk
ab80: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
ab90: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
aba0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
abb0: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c  .        k = sql
abc0: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
abd0: 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43  x(pIdx, pPk->aiC
abe0: 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20  olumn[j]);.     
abf0: 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d 30 20     assert( k>=0 
ac00: 26 26 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && k<pIdx->nColu
ac10: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mn );.        sq
ac20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ac30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
ac40: 64 78 43 75 72 2c 20 6b 2c 20 72 65 67 4b 65 79  dxCur, k, regKey
ac50: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  +j);.        Vdb
ac60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
ac70: 22 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50  ", pTab->aCol[pP
ac80: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  k->aiColumn[j]].
ac90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
aca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
acb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
acc0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4b 65  akeRecord, regKe
acd0: 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c  y, pPk->nKeyCol,
ace0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
acf0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ad00: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
ad10: 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e  , regKey, pPk->n
ad20: 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23  KeyCol);.    }.#
ad30: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
ad40: 28 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67 53  ( regChng==(regS
ad50: 74 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20 73  tat4+1) );.    s
ad60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ad70: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  (v, OP_Function0
ad80: 2c 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20 72  , 1, regStat4, r
ad90: 65 67 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  egTemp,.        
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
adb0: 61 72 2a 29 26 73 74 61 74 50 75 73 68 46 75 6e  ar*)&statPushFun
adc0: 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  cdef, P4_FUNCDEF
add0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ade0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b  beChangeP5(v, 2+
adf0: 49 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20 73  IsStat34);.    s
ae00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ae10: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64  (v, OP_Next, iId
ae20: 78 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52 6f  xCur, addrNextRo
ae30: 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  w); VdbeCoverage
ae40: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  (v);..    /* Add
ae50: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
ae60: 65 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20 2a  e stat1 table. *
ae70: 2f 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65  /.    callStatGe
ae80: 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53  t(v, regStat4, S
ae90: 54 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20 72  TAT_GET_STAT1, r
aea0: 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 61 73  egStat1);.    as
aeb0: 73 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d  sert( "BBB"[0]==
aec0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
aed0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
aee0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
aef0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61  akeRecord, regTa
af00: 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d  bname, 3, regTem
af10: 70 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20 20  p, "BBB", 0);.  
af20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af30: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
af40: 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  id, iStatCur, re
af50: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
af60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af70: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
af80: 69 53 74 61 74 43 75 72 2c 20 72 65 67 54 65 6d  iStatCur, regTem
af90: 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b  p, regNewRowid);
afa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
afb0: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
afc0: 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33  HOOK.    sqlite3
afd0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
afe0: 2d 31 2c 20 28 63 68 61 72 2a 29 70 53 74 61 74  -1, (char*)pStat
aff0: 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23 65  1, P4_TABLE);.#e
b000: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
b010: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b020: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b030: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
b040: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 73  entries to the s
b050: 74 61 74 33 20 6f 72 20 73 74 61 74 34 20 74 61  tat3 or stat4 ta
b060: 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  ble. */.#ifdef S
b070: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
b080: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
b090: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 45  {.      int regE
b0a0: 71 20 3d 20 72 65 67 53 74 61 74 31 3b 0a 20 20  q = regStat1;.  
b0b0: 20 20 20 20 69 6e 74 20 72 65 67 4c 74 20 3d 20      int regLt = 
b0c0: 72 65 67 53 74 61 74 31 2b 31 3b 0a 20 20 20 20  regStat1+1;.    
b0d0: 20 20 69 6e 74 20 72 65 67 44 4c 74 20 3d 20 72    int regDLt = r
b0e0: 65 67 53 74 61 74 31 2b 32 3b 0a 20 20 20 20 20  egStat1+2;.     
b0f0: 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65 20 3d   int regSample =
b100: 20 72 65 67 53 74 61 74 31 2b 33 3b 0a 20 20 20   regStat1+3;.   
b110: 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 20 3d 20     int regCol = 
b120: 72 65 67 53 74 61 74 31 2b 34 3b 0a 20 20 20 20  regStat1+4;.    
b130: 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65 52    int regSampleR
b140: 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c 20 2b 20  owid = regCol + 
b150: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  nCol;.      int 
b160: 61 64 64 72 4e 65 78 74 3b 0a 20 20 20 20 20 20  addrNext;.      
b170: 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 3b 0a  int addrIsNull;.
b180: 20 20 20 20 20 20 75 38 20 73 65 65 6b 4f 70 20        u8 seekOp 
b190: 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  = HasRowid(pTab)
b1a0: 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20   ? OP_NotExists 
b1b0: 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a 0a  : OP_NotFound;..
b1c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
b1d0: 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  em = MAX(pParse-
b1e0: 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f 6c 2b 6e 43  >nMem, regCol+nC
b1f0: 6f 6c 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  ol);..      addr
b200: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
b210: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b220: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
b230: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
b240: 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 2c   STAT_GET_ROWID,
b250: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29   regSampleRowid)
b260: 3b 0a 20 20 20 20 20 20 61 64 64 72 49 73 4e 75  ;.      addrIsNu
b270: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
b280: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
b290: 75 6c 6c 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f  ull, regSampleRo
b2a0: 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  wid);.      Vdbe
b2b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b2c0: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
b2d0: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
b2e0: 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67 45 71 29  _GET_NEQ, regEq)
b2f0: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
b300: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
b310: 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 2c 20 72   STAT_GET_NLT, r
b320: 65 67 4c 74 29 3b 0a 20 20 20 20 20 20 63 61 6c  egLt);.      cal
b330: 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53  lStatGet(v, regS
b340: 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e  tat4, STAT_GET_N
b350: 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b 0a 20 20  DLT, regDLt);.  
b360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b370: 64 64 4f 70 34 49 6e 74 28 76 2c 20 73 65 65 6b  ddOp4Int(v, seek
b380: 4f 70 2c 20 69 54 61 62 43 75 72 2c 20 61 64 64  Op, iTabCur, add
b390: 72 4e 65 78 74 2c 20 72 65 67 53 61 6d 70 6c 65  rNext, regSample
b3a0: 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
b3b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b3c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b3d0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
b3e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b3f0: 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
b400: 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  n(pParse, pIdx, 
b410: 69 54 61 62 43 75 72 2c 20 30 2c 20 72 65 67 53  iTabCur, 0, regS
b420: 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20  ample);.#else.  
b430: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b440: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b450: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b460: 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
b470: 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  n(pParse, pIdx, 
b480: 69 54 61 62 43 75 72 2c 20 69 2c 20 72 65 67 43  iTabCur, i, regC
b490: 6f 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ol+i);.      }. 
b4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b4b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
b4c0: 65 52 65 63 6f 72 64 2c 20 72 65 67 43 6f 6c 2c  eRecord, regCol,
b4d0: 20 6e 43 6f 6c 2c 20 72 65 67 53 61 6d 70 6c 65   nCol, regSample
b4e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
b4f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b500: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
b510: 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20  rd, regTabname, 
b520: 36 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20  6, regTemp);.   
b530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b540: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
b550: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c  wid, iStatCur+1,
b560: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
b570: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b580: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
b590: 65 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c  ert, iStatCur+1,
b5a0: 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77   regTemp, regNew
b5b0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
b5c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b5d0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61  v, OP_Goto, 1, a
b5e0: 64 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d  ddrNext); /* P1=
b5f0: 3d 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f  =1 for end-of-lo
b600: 6f 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  op */.      sqli
b610: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b620: 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a  v, addrIsNull);.
b630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
b640: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b650: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
b660: 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61  .    /* End of a
b670: 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 73  nalysis */.    s
b680: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b690: 72 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e 64  re(v, addrRewind
b6a0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72  );.  }...  /* Cr
b6b0: 65 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73 71  eate a single sq
b6c0: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79  lite_stat1 entry
b6d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c   containing NULL
b6e0: 20 61 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   as the index.  
b6f0: 2a 2a 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  ** name and the 
b700: 72 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68 65  row count as the
b710: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20   content..  */. 
b720: 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30   if( pOnlyIdx==0
b730: 20 26 26 20 6e 65 65 64 54 61 62 6c 65 43 6e 74   && needTableCnt
b740: 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d   ){.    VdbeComm
b750: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
b760: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
b770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b780: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
b790: 69 54 61 62 43 75 72 2c 20 72 65 67 53 74 61 74  iTabCur, regStat
b7a0: 31 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77  1);.    jZeroRow
b7b0: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  s = sqlite3VdbeA
b7c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
b7d0: 74 2c 20 72 65 67 53 74 61 74 31 29 3b 20 56 64  t, regStat1); Vd
b7e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b800: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
b810: 20 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29 3b   0, regIdxname);
b820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 22 42 42  .    assert( "BB
b830: 42 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  B"[0]==SQLITE_AF
b840: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73 71  F_TEXT );.    sq
b850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
b860: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
b870: 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c  , regTabname, 3,
b880: 20 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22 2c   regTemp, "BBB",
b890: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b8a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b8b0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74  _NewRowid, iStat
b8c0: 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  Cur, regNewRowid
b8d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b8e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
b8f0: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c  nsert, iStatCur,
b900: 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77   regTemp, regNew
b910: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
b920: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b930: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
b940: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
b950: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
b960: 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74  E_HOOK.    sqlit
b970: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
b980: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 53 74  , -1, (char*)pSt
b990: 61 74 31 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a  at1, P4_TABLE);.
b9a0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
b9b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b9c0: 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20  , jZeroRows);.  
b9d0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
b9e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
b9f0: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 6f  ill cause the mo
ba00: 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78 20  st recent index 
ba10: 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62  analysis to.** b
ba20: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e  e loaded into in
ba30: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
ba40: 65 73 20 77 68 65 72 65 20 69 73 20 63 61 6e 20  es where is can 
ba50: 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  be used..*/.stat
ba60: 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c  ic void loadAnal
ba70: 79 73 69 73 28 50 61 72 73 65 20 2a 70 50 61 72  ysis(Parse *pPar
ba80: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
ba90: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
baa0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
bab0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
bac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bad0: 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61  p1(v, OP_LoadAna
bae0: 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d  lysis, iDb);.  }
baf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
bb00: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
bb10: 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  l do an analysis
bb20: 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20 64 61   of an entire da
bb30: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
bb40: 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61 74   void analyzeDat
bb50: 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
bb60: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
bb70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bb80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68  Parse->db;.  Sch
bb90: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
bba0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
bbb0: 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d  ema;    /* Schem
bbc0: 61 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44  a of database iD
bbd0: 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  b */.  HashElem 
bbe0: 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43  *k;.  int iStatC
bbf0: 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  ur;.  int iMem;.
bc00: 20 20 69 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73    int iTab;..  s
bc10: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
bc20: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
bc30: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74  , 0, iDb);.  iSt
bc40: 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  atCur = pParse->
bc50: 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
bc60: 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65  nTab += 3;.  ope
bc70: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
bc80: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
bc90: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20  , 0, 0);.  iMem 
bca0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
bcb0: 3b 0a 20 20 69 54 61 62 20 3d 20 70 50 61 72 73  ;.  iTab = pPars
bcc0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 61 73 73 65 72  e->nTab;.  asser
bcd0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
bce0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
bcf0: 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b  b, 0) );.  for(k
bd00: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
bd10: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
bd20: 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  sh); k; k=sqlite
bd30: 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
bd40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bd50: 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
bd60: 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 61  shData(k);.    a
bd70: 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70  nalyzeOneTable(p
bd80: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
bd90: 69 53 74 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20  iStatCur, iMem, 
bda0: 69 54 61 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61  iTab);.  }.  loa
bdb0: 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65  dAnalysis(pParse
bdc0: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
bdd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
bde0: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
bdf0: 6e 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e  nalysis of a sin
be00: 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  gle table in.** 
be10: 61 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  a database.  If 
be20: 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e 6f 74 20  pOnlyIdx is not 
be30: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
be40: 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a  a single index.*
be50: 2a 20 69 6e 20 70 54 61 62 20 74 68 61 74 20 73  * in pTab that s
be60: 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65  hould be analyze
be70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
be80: 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50  d analyzeTable(P
be90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
bea0: 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e 64 65 78  ble *pTab, Index
beb0: 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69   *pOnlyIdx){.  i
bec0: 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 53  nt iDb;.  int iS
bed0: 74 61 74 43 75 72 3b 0a 0a 20 20 61 73 73 65 72  tatCur;..  asser
bee0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
bef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
bf00: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
bf10: 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20  xes(pParse->db) 
bf20: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
bf30: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
bf40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
bf50: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
bf60: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
bf70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
bf80: 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61   0, iDb);.  iSta
bf90: 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tCur = pParse->n
bfa0: 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Tab;.  pParse->n
bfb0: 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20  Tab += 3;.  if( 
bfc0: 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20 20 20 20  pOnlyIdx ){.    
bfd0: 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50  openStatTable(pP
bfe0: 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74  arse, iDb, iStat
bff0: 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a  Cur, pOnlyIdx->z
c000: 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b 0a 20 20  Name, "idx");.  
c010: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53  }else{.    openS
c020: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
c030: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
c040: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62  pTab->zName, "tb
c050: 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79  l");.  }.  analy
c060: 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73  zeOneTable(pPars
c070: 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64  e, pTab, pOnlyId
c080: 78 2c 20 69 53 74 61 74 43 75 72 2c 70 50 61 72  x, iStatCur,pPar
c090: 73 65 2d 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73  se->nMem+1,pPars
c0a0: 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64  e->nTab);.  load
c0b0: 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c  Analysis(pParse,
c0c0: 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
c0d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
c0e0: 72 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  r the ANALYZE co
c0f0: 6d 6d 61 6e 64 2e 20 20 54 68 65 20 70 61 72 73  mmand.  The pars
c100: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
c110: 75 74 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74  utine.** when it
c120: 20 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41   recognizes an A
c130: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
c140: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41  **.**        ANA
c150: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 20  LYZE            
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 41  -- 1.**        A
c180: 4e 41 4c 59 5a 45 20 20 3c 64 61 74 61 62 61 73  NALYZE  <databas
c190: 65 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e>              
c1a0: 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
c1b0: 20 41 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61   ANALYZE  ?<data
c1c0: 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
c1d0: 65 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46  e>  -- 3.**.** F
c1e0: 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
c1f0: 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
c200: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
c210: 65 73 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  es to be analyze
c220: 64 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61  d..** Form 2 ana
c230: 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  lyzes all indice
c240: 73 20 74 68 65 20 73 69 6e 67 6c 65 20 64 61 74  s the single dat
c250: 61 62 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20  abase named..** 
c260: 46 6f 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20  Form 3 analyzes 
c270: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
c280: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c290: 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
c2a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c  void sqlite3Anal
c2b0: 79 7a 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  yze(Parse *pPars
c2c0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
c2d0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
c2e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c2f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c300: 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69  int iDb;.  int i
c310: 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44  ;.  char *z, *zD
c320: 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
c330: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c340: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
c350: 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Name;.  Vdbe *v;
c360: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
c370: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
c380: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c390: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
c3a0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
c3b0: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
c3c0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
c3d0: 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ULL. */.  assert
c3e0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
c3f0: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50  ldsAllMutexes(pP
c400: 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69  arse->db) );.  i
c410: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
c420: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
c430: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
c440: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
c450: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
c460: 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a  || pName1==0 );.
c470: 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
c480: 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31  ){.    /* Form 1
c490: 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76 65 72 79  :  Analyze every
c4a0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72  thing */.    for
c4b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
c4c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c4d0: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
c4e0: 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61  ;  /* Do not ana
c4f0: 6c 79 7a 65 20 74 68 65 20 54 45 4d 50 20 64 61  lyze the TEMP da
c500: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
c510: 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28  analyzeDatabase(
c520: 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
c530: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  }.  }else if( pN
c540: 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 28 69  ame2->n==0 && (i
c550: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
c560: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 29 3e  Db(db, pName1))>
c570: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 61  =0 ){.    /* Ana
c580: 6c 79 7a 65 20 74 68 65 20 73 63 68 65 6d 61 20  lyze the schema 
c590: 6e 61 6d 65 64 20 61 73 20 74 68 65 20 61 72 67  named as the arg
c5a0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 61 6e 61  ument */.    ana
c5b0: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61  lyzeDatabase(pPa
c5c0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 65 6c  rse, iDb);.  }el
c5d0: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20  se{.    /* Form 
c5e0: 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 74  3: Analyze the t
c5f0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 6e 61  able or index na
c600: 6d 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  med as an argume
c610: 6e 74 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  nt */.    iDb = 
c620: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
c630: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
c640: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54 61 62  1, pName2, &pTab
c650: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  leName);.    if(
c660: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20   iDb>=0 ){.     
c670: 20 7a 44 62 20 3d 20 70 4e 61 6d 65 32 2d 3e 6e   zDb = pName2->n
c680: 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
c690: 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b 0a 20 20  zDbSName : 0;.  
c6a0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
c6b0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
c6c0: 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20   pTableName);.  
c6d0: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
c6e0: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20 3d       if( (pIdx =
c6f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
c700: 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d  x(db, z, zDb))!=
c710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
c720: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72  nalyzeTable(pPar
c730: 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  se, pIdx->pTable
c740: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
c750: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62   }else if( (pTab
c760: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
c770: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
c780: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
c790: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c7a0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c7b0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
c7c0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
c7d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
c7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c7f0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 71   }.  if( db->nSq
c800: 6c 45 78 65 63 3d 3d 30 20 26 26 20 28 76 20 3d  lExec==0 && (v =
c810: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c820: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
c830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c840: 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp0(v, OP_Expir
c850: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
c860: 20 55 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e   Used to pass in
c870: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
c880: 68 65 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64  he analyzer read
c890: 65 72 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  er through to th
c8a0: 65 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f  e.** callback ro
c8b0: 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  utine..*/.typede
c8c0: 66 20 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69  f struct analysi
c8d0: 73 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e  sInfo analysisIn
c8e0: 66 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79  fo;.struct analy
c8f0: 73 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69  sisInfo {.  sqli
c900: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
c910: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
c920: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.};../*.** The 
c930: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
c940: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
c950: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c960: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
c970: 20 6c 69 73 74 20 6f 66 20 73 70 61 63 65 20 73   list of space s
c980: 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72  eparated integer
c990: 73 2e 20 52 65 61 64 20 74 68 65 20 66 69 72 73  s. Read the firs
c9a0: 74 20 6e 4f 75 74 20 6f 66 20 74 68 65 73 65 20  t nOut of these 
c9b0: 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61  into.** the arra
c9c0: 79 20 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61  y aOut[]..*/.sta
c9d0: 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 49  tic void decodeI
c9e0: 6e 74 41 72 72 61 79 28 0a 20 20 63 68 61 72 20  ntArray(.  char 
c9f0: 2a 7a 49 6e 74 41 72 72 61 79 2c 20 20 20 20 20  *zIntArray,     
ca00: 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74    /* String cont
ca10: 61 69 6e 69 6e 67 20 69 6e 74 20 61 72 72 61 79  aining int array
ca20: 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
ca30: 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
ca40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ca50: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 4f 75   of slots in aOu
ca60: 74 5b 5d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  t[] */.  tRowcnt
ca70: 20 2a 61 4f 75 74 2c 20 20 20 20 20 20 20 20 20   *aOut,         
ca80: 2f 2a 20 53 74 6f 72 65 20 69 6e 74 65 67 65 72  /* Store integer
ca90: 73 20 68 65 72 65 20 2a 2f 0a 20 20 4c 6f 67 45  s here */.  LogE
caa0: 73 74 20 2a 61 4c 6f 67 2c 20 20 20 20 20 20 20  st *aLog,       
cab0: 20 20 20 2f 2a 20 4f 72 2c 20 69 66 20 61 4f 75     /* Or, if aOu
cac0: 74 3d 3d 30 2c 20 68 65 72 65 20 2a 2f 0a 20 20  t==0, here */.  
cad0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 20 20  Index *pIndex   
cae0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
caf0: 20 65 78 74 72 61 20 66 6c 61 67 73 20 66 6f 72   extra flags for
cb00: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
cb10: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
cb20: 20 63 68 61 72 20 2a 7a 20 3d 20 7a 49 6e 74 41   char *z = zIntA
cb30: 72 72 61 79 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  rray;.  int c;. 
cb40: 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e   int i;.  tRowcn
cb50: 74 20 76 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  t v;..#ifdef SQL
cb60: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
cb70: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
cb80: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23  z==0 ) z = "";.#
cb90: 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
cba0: 21 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  !=0 );.#endif.  
cbb0: 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69  for(i=0; *z && i
cbc0: 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOut; i++){.   
cbd0: 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   v = 0;.    whil
cbe0: 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27  e( (c=z[0])>='0'
cbf0: 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20   && c<='9' ){.  
cc00: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63      v = v*10 + c
cc10: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b   - '0';.      z+
cc20: 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  +;.    }.#ifdef 
cc30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
cc40: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
cc50: 20 69 66 28 20 61 4f 75 74 20 29 20 61 4f 75 74   if( aOut ) aOut
cc60: 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  [i] = v;.    if(
cc70: 20 61 4c 6f 67 20 29 20 61 4c 6f 67 5b 69 5d 20   aLog ) aLog[i] 
cc80: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
cc90: 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73  v);.#else.    as
cca0: 73 65 72 74 28 20 61 4f 75 74 3d 3d 30 20 29 3b  sert( aOut==0 );
ccb0: 0a 20 20 20 20 55 4e 55 53 45 44 5f 50 41 52 41  .    UNUSED_PARA
ccc0: 4d 45 54 45 52 28 61 4f 75 74 29 3b 0a 20 20 20  METER(aOut);.   
ccd0: 20 61 73 73 65 72 74 28 20 61 4c 6f 67 21 3d 30   assert( aLog!=0
cce0: 20 29 3b 0a 20 20 20 20 61 4c 6f 67 5b 69 5d 20   );.    aLog[i] 
ccf0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
cd00: 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  v);.#endif.    i
cd10: 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b  f( *z==' ' ) z++
cd20: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
cd30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
cd40: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61 73 73  3_OR_STAT4.  ass
cd50: 65 72 74 28 20 70 49 6e 64 65 78 21 3d 30 20 29  ert( pIndex!=0 )
cd60: 3b 20 7b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  ; {.#else.  if( 
cd70: 70 49 6e 64 65 78 20 29 7b 0a 23 65 6e 64 69 66  pIndex ){.#endif
cd80: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e  .    pIndex->bUn
cd90: 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  ordered = 0;.   
cda0: 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53   pIndex->noSkipS
cdb0: 63 61 6e 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  can = 0;.    whi
cdc0: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
cdd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
cde0: 72 67 6c 6f 62 28 22 75 6e 6f 72 64 65 72 65 64  rglob("unordered
cdf0: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
ce00: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e       pIndex->bUn
ce10: 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  ordered = 1;.   
ce20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
ce30: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 7a  ite3_strglob("sz
ce40: 3d 5b 30 2d 39 5d 2a 22 2c 20 7a 29 3d 3d 30 20  =[0-9]*", z)==0 
ce50: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
ce60: 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71  x->szIdxRow = sq
ce70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 71 6c 69  lite3LogEst(sqli
ce80: 74 65 33 41 74 6f 69 28 7a 2b 33 29 29 3b 0a 20  te3Atoi(z+3));. 
ce90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
cea0: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
ceb0: 6e 6f 73 6b 69 70 73 63 61 6e 2a 22 2c 20 7a 29  noskipscan*", z)
cec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
ced0: 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61  Index->noSkipSca
cee0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23  n = 1;.      }.#
cef0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cf00: 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20 20 20  BLE_COSTMULT.   
cf10: 20 20 20 65 6c 73 65 20 69 66 28 20 73 71 6c 69     else if( sqli
cf20: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 63 6f 73  te3_strglob("cos
cf30: 74 6d 75 6c 74 3d 5b 30 2d 39 5d 2a 22 2c 7a 29  tmult=[0-9]*",z)
cf40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
cf50: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 63  Index->pTable->c
cf60: 6f 73 74 4d 75 6c 74 20 3d 20 73 71 6c 69 74 65  ostMult = sqlite
cf70: 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65 33 41  3LogEst(sqlite3A
cf80: 74 6f 69 28 7a 2b 39 29 29 3b 0a 20 20 20 20 20  toi(z+9));.     
cf90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
cfa0: 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30 20 26  while( z[0]!=0 &
cfb0: 26 20 7a 5b 30 5d 21 3d 27 20 27 20 29 20 7a 2b  & z[0]!=' ' ) z+
cfc0: 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
cfd0: 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b  z[0]==' ' ) z++;
cfe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
cff0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
d000: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  k is invoked onc
d010: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  e for each index
d020: 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68   when reading th
d030: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
d040: 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  1 table.  .**.**
d050: 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e       argv[0] = n
d060: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
d070: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20  .**     argv[1] 
d080: 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  = name of the in
d090: 64 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55  dex (might be NU
d0a0: 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  LL).**     argv[
d0b0: 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20  2] = results of 
d0c0: 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e  analysis - on in
d0d0: 74 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63  teger for each c
d0e0: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72  olumn.**.** Entr
d0f0: 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72  ies for which ar
d100: 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70  gv[1]==NULL simp
d110: 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  ly record the nu
d120: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
d130: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
d140: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
d150: 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20  ysisLoader(void 
d160: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
d170: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
d180: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
d190: 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a    analysisInfo *
d1a0: 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69  pInfo = (analysi
d1b0: 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20  sInfo*)pData;.  
d1c0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
d1d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
d1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
d1f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
d200: 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==3 );.  UNUSED_
d210: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
d220: 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69 66  ed, argc);..  if
d230: 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67  ( argv==0 || arg
d240: 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b  v[0]==0 || argv[
d250: 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  2]==0 ){.    ret
d260: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
d270: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
d280: 64 54 61 62 6c 65 28 30 2c 20 70 49 6e 66 6f 2d  dTable(0, pInfo-
d290: 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49  >db, argv[0], pI
d2a0: 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  nfo->zDatabase);
d2b0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
d2c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d2d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76  ;.  }.  if( argv
d2e0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  [1]==0 ){.    pI
d2f0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ndex = 0;.  }els
d300: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
d310: 72 69 63 6d 70 28 61 72 67 76 5b 30 5d 2c 61 72  ricmp(argv[0],ar
d320: 67 76 5b 31 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  gv[1])==0 ){.   
d330: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
d340: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
d350: 28 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73  (pTable);.  }els
d360: 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  e{.    pIndex = 
d370: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
d380: 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76  (pInfo->db, argv
d390: 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74  [1], pInfo->zDat
d3a0: 61 62 61 73 65 29 3b 0a 20 20 7d 0a 20 20 7a 20  abase);.  }.  z 
d3b0: 3d 20 61 72 67 76 5b 32 5d 3b 0a 0a 20 20 69 66  = argv[2];..  if
d3c0: 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
d3d0: 74 52 6f 77 63 6e 74 20 2a 61 69 52 6f 77 45 73  tRowcnt *aiRowEs
d3e0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
d3f0: 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
d400: 65 79 43 6f 6c 2b 31 3b 0a 23 69 66 64 65 66 20  eyCol+1;.#ifdef 
d410: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
d420: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
d430: 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
d440: 73 74 20 6d 61 79 20 61 6c 72 65 61 64 79 20 62  st may already b
d450: 65 20 73 65 74 20 68 65 72 65 20 69 66 20 74 68  e set here if th
d460: 65 72 65 20 61 72 65 20 64 75 70 6c 69 63 61 74  ere are duplicat
d470: 65 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  e .    ** sqlite
d480: 5f 73 74 61 74 31 20 65 6e 74 72 69 65 73 20 66  _stat1 entries f
d490: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 20 49  or this index. I
d4a0: 6e 20 74 68 61 74 20 63 61 73 65 20 6a 75 73 74  n that case just
d4b0: 20 63 6c 6f 62 62 65 72 0a 20 20 20 20 2a 2a 20   clobber.    ** 
d4c0: 74 68 65 20 6f 6c 64 20 64 61 74 61 20 77 69 74  the old data wit
d4d0: 68 20 74 68 65 20 6e 65 77 20 69 6e 73 74 65 61  h the new instea
d4e0: 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20  d of allocating 
d4f0: 61 20 6e 65 77 20 61 72 72 61 79 2e 20 20 2a 2f  a new array.  */
d500: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
d510: 3e 61 69 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  >aiRowEst==0 ){.
d520: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
d530: 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e  RowEst = (tRowcn
d540: 74 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  t*)sqlite3Malloc
d550: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 74 52 6f 77  Zero(sizeof(tRow
d560: 63 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20  cnt) * nCol);.  
d570: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
d580: 61 69 52 6f 77 45 73 74 3d 3d 30 20 29 20 73 71  aiRowEst==0 ) sq
d590: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 49  lite3OomFault(pI
d5a0: 6e 66 6f 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  nfo->db);.    }.
d5b0: 20 20 20 20 61 69 52 6f 77 45 73 74 20 3d 20 70      aiRowEst = p
d5c0: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3b  Index->aiRowEst;
d5d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64  .#endif.    pInd
d5e0: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
d5f0: 20 30 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e   0;.    decodeIn
d600: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c  tArray((char*)z,
d610: 20 6e 43 6f 6c 2c 20 61 69 52 6f 77 45 73 74 2c   nCol, aiRowEst,
d620: 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f   pIndex->aiRowLo
d630: 67 45 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  gEst, pIndex);. 
d640: 20 20 20 70 49 6e 64 65 78 2d 3e 68 61 73 53 74     pIndex->hasSt
d650: 61 74 31 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  at1 = 1;.    if(
d660: 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
d670: 78 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  xWhere==0 ){.   
d680: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c     pTable->nRowL
d690: 6f 67 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e  ogEst = pIndex->
d6a0: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
d6b0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 74 61        pTable->ta
d6c0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
d6d0: 53 74 61 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  Stat1;.    }.  }
d6e0: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
d6f0: 66 61 6b 65 49 64 78 3b 0a 20 20 20 20 66 61 6b  fakeIdx;.    fak
d700: 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d 20  eIdx.szIdxRow = 
d710: 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77  pTable->szTabRow
d720: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d730: 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
d740: 20 20 20 20 66 61 6b 65 49 64 78 2e 70 54 61 62      fakeIdx.pTab
d750: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 23 65 6e  le = pTable;.#en
d760: 64 69 66 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  dif.    decodeIn
d770: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c  tArray((char*)z,
d780: 20 31 2c 20 30 2c 20 26 70 54 61 62 6c 65 2d 3e   1, 0, &pTable->
d790: 6e 52 6f 77 4c 6f 67 45 73 74 2c 20 26 66 61 6b  nRowLogEst, &fak
d7a0: 65 49 64 78 29 3b 0a 20 20 20 20 70 54 61 62 6c  eIdx);.    pTabl
d7b0: 65 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 66 61  e->szTabRow = fa
d7c0: 6b 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 3b 0a  keIdx.szIdxRow;.
d7d0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46      pTable->tabF
d7e0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53 74  lags |= TF_HasSt
d7f0: 61 74 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  at1;.  }..  retu
d800: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
d810: 66 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d  f the Index.aSam
d820: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20  ple variable is 
d830: 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65  not NULL, delete
d840: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
d850: 72 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20  rray.** and its 
d860: 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  contents..*/.voi
d870: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  d sqlite3DeleteI
d880: 6e 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69  ndexSamples(sqli
d890: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
d8a0: 70 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pIdx){.#ifdef SQ
d8b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
d8c0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
d8d0: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29   pIdx->aSample )
d8e0: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
d8f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
d900: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b  ->nSample; j++){
d910: 0a 20 20 20 20 20 20 49 6e 64 65 78 53 61 6d 70  .      IndexSamp
d920: 6c 65 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61  le *p = &pIdx->a
d930: 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20  Sample[j];.     
d940: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d950: 62 2c 20 70 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a  b, p->p);.    }.
d960: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d970: 65 28 64 62 2c 20 70 49 64 78 2d 3e 61 53 61 6d  e(db, pIdx->aSam
d980: 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ple);.  }.  if( 
d990: 64 62 20 26 26 20 64 62 2d 3e 70 6e 42 79 74 65  db && db->pnByte
d9a0: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
d9b0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d   pIdx->nSample =
d9c0: 20 30 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53   0;.    pIdx->aS
d9d0: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23  ample = 0;.  }.#
d9e0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d9f0: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
da00: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
da10: 70 49 64 78 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  pIdx);.#endif /*
da20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
da30: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
da40: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
da50: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
da60: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f  R_STAT4./*.** Po
da70: 70 75 6c 61 74 65 20 74 68 65 20 70 49 64 78 2d  pulate the pIdx-
da80: 3e 61 41 76 67 45 71 5b 5d 20 61 72 72 61 79 20  >aAvgEq[] array 
da90: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 61 6d  based on the sam
daa0: 70 6c 65 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ples currently.*
dab0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 49 64 78  * stored in pIdx
dac0: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f  ->aSample[]. .*/
dad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
dae0: 74 41 76 67 45 71 28 49 6e 64 65 78 20 2a 70 49  tAvgEq(Index *pI
daf0: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
db00: 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70  ){.    IndexSamp
db10: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
db20: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20  dx->aSample;.   
db30: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 46   IndexSample *pF
db40: 69 6e 61 6c 20 3d 20 26 61 53 61 6d 70 6c 65 5b  inal = &aSample[
db50: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d  pIdx->nSample-1]
db60: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
db70: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31      int nCol = 1
db80: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
db90: 6e 53 61 6d 70 6c 65 43 6f 6c 3e 31 20 29 7b 0a  nSampleCol>1 ){.
dba0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
dbb0: 20 69 73 20 73 74 61 74 34 20 64 61 74 61 2c 20   is stat4 data, 
dbc0: 74 68 65 6e 20 63 61 6c 63 75 6c 61 74 65 20 61  then calculate a
dbd0: 41 76 67 45 71 5b 5d 20 76 61 6c 75 65 73 20 66  AvgEq[] values f
dbe0: 6f 72 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  or all.      ** 
dbf0: 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 65  sample columns e
dc00: 78 63 65 70 74 20 74 68 65 20 6c 61 73 74 2e 20  xcept the last. 
dc10: 54 68 65 20 6c 61 73 74 20 69 73 20 61 6c 77 61  The last is alwa
dc20: 79 73 20 73 65 74 20 74 6f 20 31 2c 20 61 73 0a  ys set to 1, as.
dc30: 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 68        ** once th
dc40: 65 20 74 72 61 69 6c 69 6e 67 20 50 4b 20 66 69  e trailing PK fi
dc50: 65 6c 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65  elds are conside
dc60: 72 65 64 20 61 6c 6c 20 69 6e 64 65 78 20 6b 65  red all index ke
dc70: 79 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  ys are.      ** 
dc80: 75 6e 69 71 75 65 2e 20 20 2a 2f 0a 20 20 20 20  unique.  */.    
dc90: 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e    nCol = pIdx->n
dca0: 53 61 6d 70 6c 65 43 6f 6c 2d 31 3b 0a 20 20 20  SampleCol-1;.   
dcb0: 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b     pIdx->aAvgEq[
dcc0: 6e 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  nCol] = 1;.    }
dcd0: 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
dce0: 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c   iCol<nCol; iCol
dcf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
dd00: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e  Sample = pIdx->n
dd10: 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 69 6e  Sample;.      in
dd20: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
dd30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
dd40: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
dd50: 67 68 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20  gh samples */.  
dd60: 20 20 20 20 74 52 6f 77 63 6e 74 20 73 75 6d 45      tRowcnt sumE
dd70: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  q = 0;        /*
dd80: 20 53 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20   Sum of the nEq 
dd90: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
dda0: 74 52 6f 77 63 6e 74 20 61 76 67 45 71 20 3d 20  tRowcnt avgEq = 
ddb0: 30 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  0;.      tRowcnt
ddc0: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
ddd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
dde0: 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f  rows in index */
ddf0: 0a 20 20 20 20 20 20 69 36 34 20 6e 53 75 6d 31  .      i64 nSum1
de00: 30 30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  00 = 0;         
de10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
de20: 72 6d 73 20 63 6f 6e 74 72 69 62 75 74 69 6e 67  rms contributing
de30: 20 74 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20 20   to sumEq */.   
de40: 20 20 20 69 36 34 20 6e 44 69 73 74 31 30 30 3b     i64 nDist100;
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de60: 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
de70: 63 74 20 76 61 6c 75 65 73 20 69 6e 20 69 6e 64  ct values in ind
de80: 65 78 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ex */..      if(
de90: 20 21 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74   !pIdx->aiRowEst
dea0: 20 7c 7c 20 69 43 6f 6c 3e 3d 70 49 64 78 2d 3e   || iCol>=pIdx->
deb0: 6e 4b 65 79 43 6f 6c 20 7c 7c 20 70 49 64 78 2d  nKeyCol || pIdx-
dec0: 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31  >aiRowEst[iCol+1
ded0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
dee0: 6e 52 6f 77 20 3d 20 70 46 69 6e 61 6c 2d 3e 61  nRow = pFinal->a
def0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
df00: 20 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28 69     nDist100 = (i
df10: 36 34 29 31 30 30 20 2a 20 70 46 69 6e 61 6c 2d  64)100 * pFinal-
df20: 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  >anDLt[iCol];.  
df30: 20 20 20 20 20 20 6e 53 61 6d 70 6c 65 2d 2d 3b        nSample--;
df40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df50: 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 70 49 64        nRow = pId
df60: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
df70: 20 20 20 20 20 20 20 20 6e 44 69 73 74 31 30 30          nDist100
df80: 20 3d 20 28 28 69 36 34 29 31 30 30 20 2a 20 70   = ((i64)100 * p
df90: 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  Idx->aiRowEst[0]
dfa0: 29 20 2f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  ) / pIdx->aiRowE
dfb0: 73 74 5b 69 43 6f 6c 2b 31 5d 3b 0a 20 20 20 20  st[iCol+1];.    
dfc0: 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78 2d 3e    }.      pIdx->
dfd0: 6e 52 6f 77 45 73 74 30 20 3d 20 6e 52 6f 77 3b  nRowEst0 = nRow;
dfe0: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e  ..      /* Set n
dff0: 53 75 6d 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  Sum to the numbe
e000: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 28 69  r of distinct (i
e010: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
e020: 66 69 78 65 73 20 74 68 61 74 0a 20 20 20 20 20  fixes that.     
e030: 20 2a 2a 20 6f 63 63 75 72 20 69 6e 20 74 68 65   ** occur in the
e040: 20 73 74 61 74 34 20 74 61 62 6c 65 20 66 6f 72   stat4 table for
e050: 20 74 68 69 73 20 69 6e 64 65 78 2e 20 53 65 74   this index. Set
e060: 20 73 75 6d 45 71 20 74 6f 20 74 68 65 20 73 75   sumEq to the su
e070: 6d 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 74  m of .      ** t
e080: 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 66 6f  he nEq values fo
e090: 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f  r column iCol fo
e0a0: 72 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 28  r the same set (
e0b0: 61 64 64 69 6e 67 20 74 68 65 20 76 61 6c 75 65  adding the value
e0c0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 20   .      ** only 
e0d0: 6f 6e 63 65 20 77 68 65 72 65 20 74 68 65 72 65  once where there
e0e0: 20 65 78 69 73 74 20 64 75 70 6c 69 63 61 74 65   exist duplicate
e0f0: 20 70 72 65 66 69 78 65 73 29 2e 20 20 2a 2f 0a   prefixes).  */.
e100: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e110: 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  <nSample; i++){.
e120: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28          if( i==(
e130: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 29  pIdx->nSample-1)
e140: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 61 53 61  .         || aSa
e150: 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43  mple[i].anDLt[iC
e160: 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b 31  ol]!=aSample[i+1
e170: 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 0a 20  ].anDLt[iCol] . 
e180: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
e190: 20 20 20 20 73 75 6d 45 71 20 2b 3d 20 61 53 61      sumEq += aSa
e1a0: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
e1b0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  l];.          nS
e1c0: 75 6d 31 30 30 20 2b 3d 20 31 30 30 3b 0a 20 20  um100 += 100;.  
e1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e1e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 73 74  .      if( nDist
e1f0: 31 30 30 3e 6e 53 75 6d 31 30 30 20 26 26 20 73  100>nSum100 && s
e200: 75 6d 45 71 3c 6e 52 6f 77 20 29 7b 0a 20 20 20  umEq<nRow ){.   
e210: 20 20 20 20 20 61 76 67 45 71 20 3d 20 28 28 69       avgEq = ((i
e220: 36 34 29 31 30 30 20 2a 20 28 6e 52 6f 77 20 2d  64)100 * (nRow -
e230: 20 73 75 6d 45 71 29 29 2f 28 6e 44 69 73 74 31   sumEq))/(nDist1
e240: 30 30 20 2d 20 6e 53 75 6d 31 30 30 29 3b 0a 20  00 - nSum100);. 
e250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e260: 20 61 76 67 45 71 3d 3d 30 20 29 20 61 76 67 45   avgEq==0 ) avgE
e270: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64  q = 1;.      pId
e280: 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20  x->aAvgEq[iCol] 
e290: 3d 20 61 76 67 45 71 3b 0a 20 20 20 20 7d 0a 20  = avgEq;.    }. 
e2a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b   }.}../*.** Look
e2b0: 20 75 70 20 61 6e 20 69 6e 64 65 78 20 62 79 20   up an index by 
e2c0: 6e 61 6d 65 2e 20 20 4f 72 2c 20 69 66 20 74 68  name.  Or, if th
e2d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 57 49 54 48  e name of a WITH
e2e0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a  OUT ROWID table.
e2f0: 2a 2a 20 69 73 20 73 75 70 70 6c 69 65 64 20 69  ** is supplied i
e300: 6e 73 74 65 61 64 2c 20 66 69 6e 64 20 74 68 65  nstead, find the
e310: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e320: 65 78 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  ex for that tabl
e330: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 6e 64  e..*/.static Ind
e340: 65 78 20 2a 66 69 6e 64 49 6e 64 65 78 4f 72 50  ex *findIndexOrP
e350: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 73 71 6c  rimaryKey(.  sql
e360: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e370: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
e380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
e390: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  .){.  Index *pId
e3a0: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
e3b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
e3c0: 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 49 64 78  zDb);.  if( pIdx
e3d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
e3e0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33   *pTab = sqlite3
e3f0: 46 69 6e 64 54 61 62 6c 65 28 30 2c 20 64 62 2c  FindTable(0, db,
e400: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
e410: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 48    if( pTab && !H
e420: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
e430: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 50 72  pIdx = sqlite3Pr
e440: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
e450: 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ab);.  }.  retur
e460: 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pIdx;.}../*.**
e470: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
e480: 74 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  t from either th
e490: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 6f  e sqlite_stat4 o
e4a0: 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  r sqlite_stat3 t
e4b0: 61 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f 20 74 68  able .** into th
e4c0: 65 20 72 65 6c 65 76 61 6e 74 20 49 6e 64 65 78  e relevant Index
e4d0: 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79  .aSample[] array
e4e0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
e4f0: 74 73 20 7a 53 71 6c 31 20 61 6e 64 20 7a 53 71  ts zSql1 and zSq
e500: 6c 32 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  l2 must point to
e510: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
e520: 74 68 61 74 20 72 65 74 75 72 6e 0a 2a 2a 20 64  that return.** d
e530: 61 74 61 20 65 71 75 69 76 61 6c 65 6e 74 20 74  ata equivalent t
e540: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
e550: 28 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20  (statements are 
e560: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 73 74  different for st
e570: 61 74 33 2c 0a 2a 2a 20 73 65 65 20 74 68 65 20  at3,.** see the 
e580: 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
e590: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61  unction for deta
e5a0: 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 7a  ils):.**.**    z
e5b0: 53 71 6c 31 3a 20 53 45 4c 45 43 54 20 69 64 78  Sql1: SELECT idx
e5c0: 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25  ,count(*) FROM %
e5d0: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47  Q.sqlite_stat4 G
e5e0: 52 4f 55 50 20 42 59 20 69 64 78 0a 2a 2a 20 20  ROUP BY idx.**  
e5f0: 20 20 7a 53 71 6c 32 3a 20 53 45 4c 45 43 54 20    zSql2: SELECT 
e600: 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74  idx,neq,nlt,ndlt
e610: 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e  ,sample FROM %Q.
e620: 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2a 0a  sqlite_stat4.**.
e630: 2a 2a 20 77 68 65 72 65 20 25 51 20 69 73 20 72  ** where %Q is r
e640: 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65  eplaced with the
e650: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 62   database name b
e660: 65 66 6f 72 65 20 74 68 65 20 53 51 4c 20 69 73  efore the SQL is
e670: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
e680: 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61  atic int loadSta
e690: 74 54 62 6c 28 0a 20 20 73 71 6c 69 74 65 33 20  tTbl(.  sqlite3 
e6a0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
e6b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e6c0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
e6d0: 74 20 62 53 74 61 74 33 2c 20 20 20 20 20 20 20  t bStat3,       
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e6f0: 73 73 75 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c  ssume single col
e700: 75 6d 6e 20 72 65 63 6f 72 64 73 20 6f 6e 6c 79  umn records only
e710: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e720: 20 2a 7a 53 71 6c 31 2c 20 20 20 20 20 20 20 20   *zSql1,        
e730: 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
e740: 6d 65 6e 74 20 31 20 28 73 65 65 20 61 62 6f 76  ment 1 (see abov
e750: 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e) */.  const ch
e760: 61 72 20 2a 7a 53 71 6c 32 2c 20 20 20 20 20 20  ar *zSql2,      
e770: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
e780: 74 65 6d 65 6e 74 20 32 20 28 73 65 65 20 61 62  tement 2 (see ab
e790: 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ove) */.  const 
e7a0: 63 68 61 72 20 2a 7a 44 62 20 20 20 20 20 20 20  char *zDb       
e7b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e7c0: 61 73 65 20 6e 61 6d 65 20 28 65 2e 67 2e 20 22  ase name (e.g. "
e7d0: 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a 20 20 69  main") */.){.  i
e7e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e800: 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f  Result codes fro
e810: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
e820: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
e830: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
e840: 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
e850: 6d 65 6e 74 20 62 65 69 6e 67 20 72 75 6e 20 2a  ment being run *
e860: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  /.  char *zSql; 
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
e890: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
e8a0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 65 76  /.  Index *pPrev
e8b0: 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
e8c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 69 6e    /* Previous in
e8d0: 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
e8e0: 2a 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  */.  IndexSample
e8f0: 20 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20 20 20   *pSample;      
e900: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69 6e 20     /* A slot in 
e910: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20  pIdx->aSample[] 
e920: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  */..  assert( db
e930: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
e940: 61 62 6c 65 20 29 3b 0a 20 20 7a 53 71 6c 20 3d  able );.  zSql =
e950: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e960: 64 62 2c 20 7a 53 71 6c 31 2c 20 7a 44 62 29 3b  db, zSql1, zDb);
e970: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
e980: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e990: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
e9a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e9b0: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
e9c0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
e9d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
e9e0: 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
e9f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ea00: 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71  rc;..  while( sq
ea10: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
ea20: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
ea30: 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 43 6f 6c  .    int nIdxCol
ea40: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
ea50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ea60: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 74 61 74 34  columns in stat4
ea70: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 20 20 20   records */..   
ea80: 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20   char *zIndex;  
ea90: 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a   /* Index name *
eaa0: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
eab0: 78 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  x;    /* Pointer
eac0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62   to the index ob
ead0: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
eae0: 6e 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e  nSample;    /* N
eaf0: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
eb00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
eb10: 65 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  e;      /* Bytes
eb20: 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72   of space requir
eb30: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
eb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
eb50: 65 73 20 6f 66 20 73 70 61 63 65 20 72 65 71 75  es of space requ
eb60: 69 72 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ired */.    tRow
eb70: 63 6e 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20  cnt *pSpace;..  
eb80: 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72    zIndex = (char
eb90: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
eba0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
ebb0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78  ;.    if( zIndex
ebc0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
ebd0: 20 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71      nSample = sq
ebe0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
ebf0: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
ec00: 70 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65 78  pIdx = findIndex
ec10: 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62 2c  OrPrimaryKey(db,
ec20: 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20   zIndex, zDb);. 
ec30: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 3d     assert( pIdx=
ec40: 3d 30 20 7c 7c 20 62 53 74 61 74 33 20 7c 7c 20  =0 || bStat3 || 
ec50: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30  pIdx->nSample==0
ec60: 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78   );.    /* Index
ec70: 2e 6e 53 61 6d 70 6c 65 20 69 73 20 6e 6f 6e 2d  .nSample is non-
ec80: 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69  zero at this poi
ec90: 6e 74 20 69 66 20 64 61 74 61 20 68 61 73 20 61  nt if data has a
eca0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
ecb0: 2a 2a 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74  ** loaded from t
ecc0: 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  he stat4 table. 
ecd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e  In this case ign
ece0: 6f 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20  ore stat3 data. 
ecf0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
ed00: 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61  ==0 || pIdx->nSa
ed10: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
ed20: 0a 20 20 20 20 69 66 28 20 62 53 74 61 74 33 3d  .    if( bStat3=
ed30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
ed40: 72 74 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  rt( !HasRowid(pI
ed50: 64 78 2d 3e 70 54 61 62 6c 65 29 20 7c 7c 20 70  dx->pTable) || p
ed60: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 70 49  Idx->nColumn==pI
ed70: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 20 29 3b  dx->nKeyCol+1 );
ed80: 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52  .      if( !HasR
ed90: 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
eda0: 65 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  e) && IsPrimaryK
edb0: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  eyIndex(pIdx) ){
edc0: 0a 20 20 20 20 20 20 20 20 6e 49 64 78 43 6f 6c  .        nIdxCol
edd0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
ede0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
edf0: 20 20 20 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d         nIdxCol =
ee00: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
ee10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ee20: 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43    pIdx->nSampleC
ee30: 6f 6c 20 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  ol = nIdxCol;.  
ee40: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
ee50: 28 49 6e 64 65 78 53 61 6d 70 6c 65 29 20 2a 20  (IndexSample) * 
ee60: 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79  nSample;.    nBy
ee70: 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f  te += sizeof(tRo
ee80: 77 63 6e 74 29 20 2a 20 6e 49 64 78 43 6f 6c 20  wcnt) * nIdxCol 
ee90: 2a 20 33 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20  * 3 * nSample;. 
eea0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 49 64 78     nByte += nIdx
eeb0: 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 74 52 6f  Col * sizeof(tRo
eec0: 77 63 6e 74 29 3b 20 20 20 20 20 2f 2a 20 53 70  wcnt);     /* Sp
eed0: 61 63 65 20 66 6f 72 20 49 6e 64 65 78 2e 61 41  ace for Index.aA
eee0: 76 67 45 71 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70  vgEq[] */..    p
eef0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 73  Idx->aSample = s
ef00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ef10: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
ef20: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61     if( pIdx->aSa
ef30: 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mple==0 ){.     
ef40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ef50: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
ef60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ef70: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
ef80: 20 20 20 20 70 53 70 61 63 65 20 3d 20 28 74 52      pSpace = (tR
ef90: 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61 53  owcnt*)&pIdx->aS
efa0: 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a  ample[nSample];.
efb0: 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71      pIdx->aAvgEq
efc0: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
efd0: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
efe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61    for(i=0; i<nSa
eff0: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
f000: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b    pIdx->aSample[
f010: 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61 63 65  i].anEq = pSpace
f020: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
f030: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  Col;.      pIdx-
f040: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74  >aSample[i].anLt
f050: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
f060: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
f070: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
f080: 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53 70  e[i].anDLt = pSp
f090: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e  ace; pSpace += n
f0a0: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20  IdxCol;.    }.  
f0b0: 20 20 61 73 73 65 72 74 28 20 28 28 75 38 2a 29    assert( ((u8*)
f0c0: 70 53 70 61 63 65 29 2d 6e 42 79 74 65 3d 3d 28  pSpace)-nByte==(
f0d0: 75 38 2a 29 28 70 49 64 78 2d 3e 61 53 61 6d 70  u8*)(pIdx->aSamp
f0e0: 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  le) );.  }.  rc 
f0f0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
f100: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
f110: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f120: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
f130: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53  e3MPrintf(db, zS
f140: 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  ql2, zDb);.  if(
f150: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65   !zSql ){.    re
f160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f170: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  M_BKPT;.  }.  rc
f180: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
f190: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
f1a0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
f1b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f1c0: 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63   zSql);.  if( rc
f1d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
f1e0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
f1f0: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
f200: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
f210: 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 20  har *zIndex;    
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f230: 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  Index name */.  
f240: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
f270: 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e index object *
f280: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  /.    int nCol =
f290: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
f2a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f2b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65   columns in inde
f2c0: 78 20 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78  x */..    zIndex
f2d0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
f2e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
f2f0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
f300: 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f  ( zIndex==0 ) co
f310: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
f320: 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72   = findIndexOrPr
f330: 69 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e  imaryKey(db, zIn
f340: 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  dex, zDb);.    i
f350: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e  f( pIdx==0 ) con
f360: 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68  tinue;.    /* Th
f370: 69 73 20 6e 65 78 74 20 63 6f 6e 64 69 74 69 6f  is next conditio
f380: 6e 20 69 73 20 74 72 75 65 20 69 66 20 64 61 74  n is true if dat
f390: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
f3a0: 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 0a  en loaded from .
f3b0: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
f3c0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 49  e_stat4 table. I
f3d0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e 6f  n this case igno
f3e0: 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20 20  re stat3 data.  
f3f0: 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  */.    nCol = pI
f400: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3b 0a  dx->nSampleCol;.
f410: 20 20 20 20 69 66 28 20 62 53 74 61 74 33 20 26      if( bStat3 &
f420: 26 20 6e 43 6f 6c 3e 31 20 29 20 63 6f 6e 74 69  & nCol>1 ) conti
f430: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nue;.    if( pId
f440: 78 21 3d 70 50 72 65 76 49 64 78 20 29 7b 0a 20  x!=pPrevIdx ){. 
f450: 20 20 20 20 20 69 6e 69 74 41 76 67 45 71 28 70       initAvgEq(p
f460: 50 72 65 76 49 64 78 29 3b 0a 20 20 20 20 20 20  PrevIdx);.      
f470: 70 50 72 65 76 49 64 78 20 3d 20 70 49 64 78 3b  pPrevIdx = pIdx;
f480: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 61 6d 70  .    }.    pSamp
f490: 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d  le = &pIdx->aSam
f4a0: 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ple[pIdx->nSampl
f4b0: 65 5d 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  e];.    decodeIn
f4c0: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
f4d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
f4e0: 74 28 70 53 74 6d 74 2c 31 29 2c 6e 43 6f 6c 2c  t(pStmt,1),nCol,
f4f0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c 30 2c  pSample->anEq,0,
f500: 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  0);.    decodeIn
f510: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
f520: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
f530: 74 28 70 53 74 6d 74 2c 32 29 2c 6e 43 6f 6c 2c  t(pStmt,2),nCol,
f540: 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 2c 30 2c  pSample->anLt,0,
f550: 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  0);.    decodeIn
f560: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
f570: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
f580: 74 28 70 53 74 6d 74 2c 33 29 2c 6e 43 6f 6c 2c  t(pStmt,3),nCol,
f590: 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30  pSample->anDLt,0
f5a0: 2c 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 61 6b  ,0);..    /* Tak
f5b0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
f5c0: 73 61 6d 70 6c 65 2e 20 41 64 64 20 74 77 6f 20  sample. Add two 
f5d0: 30 78 30 30 20 62 79 74 65 73 20 74 68 65 20 65  0x00 bytes the e
f5e0: 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
f5f0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
f600: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 61 6d   in case the sam
f610: 70 6c 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  ple record is co
f620: 72 72 75 70 74 65 64 2e 20 49 6e 20 74 68 61 74  rrupted. In that
f630: 20 63 61 73 65 2c 20 74 68 65 0a 20 20 20 20 2a   case, the.    *
f640: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
f650: 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 6d 61 79  ordCompare() may
f660: 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f 20   read up to two 
f670: 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
f680: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
f690: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  he allocated buf
f6a0: 66 65 72 20 62 65 66 6f 72 65 20 69 74 20 72 65  fer before it re
f6b0: 61 6c 69 7a 65 73 20 69 74 20 69 73 20 64 65 61  alizes it is dea
f6c0: 6c 69 6e 67 20 77 69 74 68 0a 20 20 20 20 2a 2a  ling with.    **
f6d0: 20 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72   a corrupt recor
f6e0: 64 2e 20 41 64 64 69 6e 67 20 74 68 65 20 74 77  d. Adding the tw
f6f0: 6f 20 30 78 30 30 20 62 79 74 65 73 20 70 72 65  o 0x00 bytes pre
f700: 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 20  vents this from 
f710: 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61  causing.    ** a
f720: 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
f730: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 61 6d 70 6c  .  */.    pSampl
f740: 65 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  e->n = sqlite3_c
f750: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
f760: 74 2c 20 34 29 3b 0a 20 20 20 20 70 53 61 6d 70  t, 4);.    pSamp
f770: 6c 65 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33 44  le->p = sqlite3D
f780: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f790: 70 53 61 6d 70 6c 65 2d 3e 6e 20 2b 20 32 29 3b  pSample->n + 2);
f7a0: 0a 20 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65  .    if( pSample
f7b0: 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->p==0 ){.      
f7c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
f7d0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
f7e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f7f0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
f800: 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e     if( pSample->
f810: 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  n ){.      memcp
f820: 79 28 70 53 61 6d 70 6c 65 2d 3e 70 2c 20 73 71  y(pSample->p, sq
f830: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
f840: 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 70 53 61  b(pStmt, 4), pSa
f850: 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  mple->n);.    }.
f860: 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c      pIdx->nSampl
f870: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e++;.  }.  rc = 
f880: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
f890: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
f8a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 69  c==SQLITE_OK ) i
f8b0: 6e 69 74 41 76 67 45 71 28 70 50 72 65 76 49 64  nitAvgEq(pPrevId
f8c0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
f8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 63  .}../*.** Load c
f8e0: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
f8f0: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 6e 64  sqlite_stat4 and
f900: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
f910: 62 6c 65 73 20 69 6e 74 6f 20 0a 2a 2a 20 74 68  bles into .** th
f920: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  e Index.aSample[
f930: 5d 20 61 72 72 61 79 73 20 6f 66 20 61 6c 6c 20  ] arrays of all 
f940: 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  indices..*/.stat
f950: 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61 74 34  ic int loadStat4
f960: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
f970: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
f980: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f990: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
f9a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
f9b0: 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  s from subroutin
f9c0: 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
f9d0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
f9e0: 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 69 66 28  Disable );.  if(
f9f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
fa00: 65 28 30 2c 20 64 62 2c 20 22 73 71 6c 69 74 65  e(0, db, "sqlite
fa10: 5f 73 74 61 74 34 22 2c 20 7a 44 62 29 20 29 7b  _stat4", zDb) ){
fa20: 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74  .    rc = loadSt
fa30: 61 74 54 62 6c 28 64 62 2c 20 30 2c 0a 20 20 20  atTbl(db, 0,.   
fa40: 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63     "SELECT idx,c
fa50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e  ount(*) FROM %Q.
fa60: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47 52 4f  sqlite_stat4 GRO
fa70: 55 50 20 42 59 20 69 64 78 22 2c 20 0a 20 20 20  UP BY idx", .   
fa80: 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e     "SELECT idx,n
fa90: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
faa0: 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  le FROM %Q.sqlit
fab0: 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20  e_stat4",.      
fac0: 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  zDb.    );.  }..
fad0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fae0: 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 46 69  _OK && sqlite3Fi
faf0: 6e 64 54 61 62 6c 65 28 30 2c 20 64 62 2c 20 22  ndTable(0, db, "
fb00: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 7a  sqlite_stat3", z
fb10: 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Db) ){.    rc = 
fb20: 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20  loadStatTbl(db, 
fb30: 31 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  1,.      "SELECT
fb40: 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52   idx,count(*) FR
fb50: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
fb60: 74 33 20 47 52 4f 55 50 20 42 59 20 69 64 78 22  t3 GROUP BY idx"
fb70: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
fb80: 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c   idx,neq,nlt,ndl
fb90: 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f 72 64 28  t,sqlite_record(
fba0: 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51 2e  sample) FROM %Q.
fbb0: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a 20  sqlite_stat3",. 
fbc0: 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a       zDb.    );.
fbd0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fbe0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fbf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
fc00: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
fc10: 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f  *.** Load the co
fc20: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c  ntent of the sql
fc30: 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
fc40: 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62  lite_stat3/4 tab
fc50: 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e 74  les. The.** cont
fc60: 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73  ents of sqlite_s
fc70: 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74 6f  tat1 are used to
fc80: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49 6e   populate the In
fc90: 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a 2a  dex.aiRowEst[].*
fca0: 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63 6f  * arrays. The co
fcb0: 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65  ntents of sqlite
fcc0: 5f 73 74 61 74 33 2f 34 20 61 72 65 20 75 73 65  _stat3/4 are use
fcd0: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  d to populate th
fce0: 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70  e.** Index.aSamp
fcf0: 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a  le[] arrays..**.
fd00: 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  ** If the sqlite
fd10: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73 20  _stat1 table is 
fd20: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
fd30: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
fd40: 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20  ITE_ERROR.** is 
fd50: 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
fd60: 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66 20  s case, even if 
fd70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
fd80: 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65  AT3/4 was define
fd90: 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d  d .** during com
fda0: 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  pilation and the
fdb0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20   sqlite_stat3/4 
fdc0: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
fdd0: 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a  , no data is .**
fde0: 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a   read from it..*
fdf0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
fe00: 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61  NABLE_STAT3/4 wa
fe10: 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e 67  s defined during
fe20: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64   compilation and
fe30: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f   the .** sqlite_
fe40: 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20 6e  stat4 table is n
fe50: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
fe60: 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
fe70: 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72  TE_ERROR is.** r
fe80: 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65 72  eturned. However
fe90: 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  , in this case, 
fea0: 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f  data is read fro
feb0: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
fec0: 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66 20  t1.** table (if 
fed0: 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20 62  it is present) b
fee0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
fef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
ff00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
ff10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
ff20: 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c  ays sets db->mal
ff30: 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68  locFailed..** Th
ff40: 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
ff50: 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
ff60: 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65 72  care about other
ff70: 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65 74   errors, the ret
ff80: 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20  urn.** code may 
ff90: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  be ignored..*/.i
ffa0: 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73  nt sqlite3Analys
ffb0: 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  isLoad(sqlite3 *
ffc0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
ffd0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e  analysisInfo sIn
ffe0: 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  fo;.  HashElem *
fff0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  i;.  char *zSql;
10000 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10010 54 45 5f 4f 4b 3b 0a 20 20 53 63 68 65 6d 61 20  TE_OK;.  Schema 
10020 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
10030 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
10040 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
10050 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
10060 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
10070 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
10080 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  =0 );..  /* Clea
10090 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74  r any prior stat
100a0 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73 73 65  istics */.  asse
100b0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
100c0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
100d0 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28  Db, 0) );.  for(
100e0 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
100f0 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
10100 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
10110 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
10120 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
10130 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
10140 69 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61  i);.    pTab->ta
10150 62 46 6c 61 67 73 20 26 3d 20 7e 54 46 5f 48 61  bFlags &= ~TF_Ha
10160 73 53 74 61 74 31 3b 0a 20 20 7d 0a 20 20 66 6f  sStat1;.  }.  fo
10170 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
10180 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
10190 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  xHash); i; i=sql
101a0 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
101b0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
101c0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
101d0 61 28 69 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  a(i);.    pIdx->
101e0 68 61 73 53 74 61 74 31 20 3d 20 30 3b 0a 23 69  hasStat1 = 0;.#i
101f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10200 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
10210 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  4.    sqlite3Del
10220 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28  eteIndexSamples(
10230 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70  db, pIdx);.    p
10240 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30  Idx->aSample = 0
10250 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
10260 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74  /* Load new stat
10270 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68  istics out of th
10280 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
10290 61 62 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e  able */.  sInfo.
102a0 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f  db = db;.  sInfo
102b0 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d  .zDatabase = db-
102c0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
102d0 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  me;.  if( sqlite
102e0 33 46 69 6e 64 54 61 62 6c 65 28 30 2c 20 64 62  3FindTable(0, db
102f0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
10300 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73  , sInfo.zDatabas
10310 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 7a 53 71  e)!=0 ){.    zSq
10320 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
10330 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
10340 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c  "SELECT tbl,idx,
10350 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c  stat FROM %Q.sql
10360 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66  ite_stat1", sInf
10370 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
10380 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
10390 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
103a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
103b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
103c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
103d0 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c  c(db, zSql, anal
103e0 79 73 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e  ysisLoader, &sIn
103f0 66 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  fo, 0);.      sq
10400 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10410 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zSql);.    }.  }
10420 0a 0a 20 20 2f 2a 20 53 65 74 20 61 70 70 72 6f  ..  /* Set appro
10430 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 73 20  priate defaults 
10440 6f 6e 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 6e  on all indexes n
10450 6f 74 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ot in the sqlite
10460 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a  _stat1 table */.
10470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10480 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10490 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
104a0 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
104b0 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
104c0 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69  ->idxHash); i; i
104d0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
104e0 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
104f0 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
10500 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
10510 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74  ( !pIdx->hasStat
10520 31 20 29 20 73 71 6c 69 74 65 33 44 65 66 61 75  1 ) sqlite3Defau
10530 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a  ltRowEst(pIdx);.
10540 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74    }..  /* Load t
10550 68 65 20 73 74 61 74 69 73 74 69 63 73 20 66 72  he statistics fr
10560 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
10570 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69  at4 table. */.#i
10580 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10590 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
105a0 34 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  4.  if( rc==SQLI
105b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
105c0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
105d0 62 6c 65 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ble++;.    rc = 
105e0 6c 6f 61 64 53 74 61 74 34 28 64 62 2c 20 73 49  loadStat4(db, sI
105f0 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  nfo.zDatabase);.
10600 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
10610 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20  e.bDisable--;.  
10620 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
10630 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
10640 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b  ma->idxHash); i;
10650 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
10660 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  t(i)){.    Index
10670 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
10680 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
10690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
106a0 78 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 20 20  x->aiRowEst);.  
106b0 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74    pIdx->aiRowEst
106c0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
106d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
106e0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
106f0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
10700 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
10710 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66  n rc;.}...#endif
10720 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10730 41 4e 41 4c 59 5a 45 20 2a 2f 0a                 ANALYZE */.