/ Hex Artifact Content
Login

Artifact 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
26e0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
26f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
2700: 2e 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a  .%s(%s)", pDb->z
2710: 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61  DbSName, zTab, a
2720: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20  Table[i].zCols. 
2730: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2740: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
2750: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
2760: 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c        aCreateTbl
2770: 5b 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49  [i] = OPFLAG_P2I
2780: 53 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SREG;.      }.  
2790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
27b0: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
27c0: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
27d0: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
27e0: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
27f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2800: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2810: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
2820: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
2830: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
2840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2850: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
2860: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
2870: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43  ->tnum;.      aC
2880: 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b  reateTbl[i] = 0;
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
28a0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
28b0: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
28c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
28d0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
28f0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2900: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
2920: 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
2930: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
2940: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65  Name, zTab, zWhe
2950: 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20  reType, zWhere. 
2960: 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
2980: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
2990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62      }else if( db
29a0: 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
29b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
29c0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
29d0: 73 65 28 70 50 61 72 73 65 2c 20 22 44 45 4c 45  se(pParse, "DELE
29e0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 22 2c 20  TE FROM %Q.%s", 
29f0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2a00: 54 61 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Tab);.#endif.   
2a10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a20: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f    /* The sqlite_
2a30: 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 20  stat[134] table 
2a40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
2a50: 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73   Delete all rows
2a60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a80: 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f  , OP_Clear, aRoo
2a90: 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20  t[i], iDb);.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c   /* Open the sql
2ac0: 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61  ite_stat[134] ta
2ad0: 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69 6e 67  bles for writing
2ae0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
2af0: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b  aTable[i].zCols;
2b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2b10: 74 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  t( i<ArraySize(a
2b20: 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 73 71  Table) );.    sq
2b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2b40: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
2b50: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
2b60: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33  aRoot[i], iDb, 3
2b70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b80: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 43  beChangeP5(v, aC
2b90: 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20  reateTbl[i]);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d  , aTable[i].zNam
2bc0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e));.  }.}../*.*
2bd0: 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75  * Recommended nu
2be0: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
2bf0: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 34  for sqlite_stat4
2c00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2c10: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
2c20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
2c30: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 32  _STAT4_SAMPLES 2
2c40: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
2c50: 54 68 72 65 65 20 53 51 4c 20 66 75 6e 63 74 69  Three SQL functi
2c60: 6f 6e 73 20 2d 20 73 74 61 74 5f 69 6e 69 74 28  ons - stat_init(
2c70: 29 2c 20 73 74 61 74 5f 70 75 73 68 28 29 2c 20  ), stat_push(), 
2c80: 61 6e 64 20 73 74 61 74 5f 67 65 74 28 29 20 2d  and stat_get() -
2c90: 0a 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73  .** share an ins
2ca0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2cb0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2cc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73   to hold their s
2cd0: 74 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  tate.** informat
2ce0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2cf0: 73 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75  struct Stat4Accu
2d00: 6d 20 53 74 61 74 34 41 63 63 75 6d 3b 0a 74 79  m Stat4Accum;.ty
2d10: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2d20: 74 34 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61  t4Sample Stat4Sa
2d30: 6d 70 6c 65 3b 0a 73 74 72 75 63 74 20 53 74 61  mple;.struct Sta
2d40: 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f  t4Sample {.  tRo
2d50: 77 63 6e 74 20 2a 61 6e 45 71 3b 20 20 20 20 20  wcnt *anEq;     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d70: 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71  sqlite_stat4.nEq
2d80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
2d90: 6e 44 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20  nDLt;           
2da0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f        /* sqlite_
2db0: 73 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69  stat4.nDLt */.#i
2dc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2dd0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
2de0: 34 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c  4.  tRowcnt *anL
2df0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e00: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
2e10: 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69  at4.nLt */.  uni
2e20: 6f 6e 20 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  on {.    i64 iRo
2e30: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e50: 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20  d in main table 
2e60: 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  of the key */.  
2e70: 20 20 75 38 20 2a 61 52 6f 77 69 64 3b 20 20 20    u8 *aRowid;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20 57 49 54    /* Key for WIT
2ea0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2eb0: 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33  s */.  } u;.  u3
2ec0: 32 20 6e 52 6f 77 69 64 3b 20 20 20 20 20 20 20  2 nRowid;       
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 53 69 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d   Sizeof aRowid[]
2ef0: 20 2a 2f 0a 20 20 75 38 20 69 73 50 53 61 6d 70   */.  u8 isPSamp
2f00: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2f10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f20: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2f30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  le */.  int iCol
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21 69          /* If !i
2f60: 73 50 53 61 6d 70 6c 65 2c 20 74 68 65 20 72 65  sPSample, the re
2f70: 61 73 6f 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69  ason for inclusi
2f80: 6f 6e 20 2a 2f 0a 20 20 75 33 32 20 69 48 61 73  on */.  u32 iHas
2f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72          /* Tiebr
2fb0: 65 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 23 65  eaker hash */.#e
2fc0: 6e 64 69 66 0a 7d 3b 20 20 20 20 20 20 20 20 20  ndif.};         
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 0a 73 74 72 75             .stru
3000: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a  ct Stat4Accum {.
3010: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3030: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
3040: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
3050: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
3060: 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  PSample;        
3070: 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f   /* How often to
3080: 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73   do a periodic s
3090: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ample */.  int n
30a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
30b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
30d0: 65 78 20 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f  ex + pk/rowid */
30e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
3110: 63 6f 6c 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20  columns w/o the 
3120: 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  pk/rowid */.  in
3130: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3150: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  um number of sam
3160: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
3170: 74 65 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d  te */.  Stat4Sam
3180: 70 6c 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20  ple current;    
3190: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
31a0: 20 61 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c   as a Stat4Sampl
31b0: 65 20 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b  e */.  u32 iPrn;
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f   /* Pseudo-rando
31e0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
31f0: 72 20 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20  r sampling */.  
3200: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65  Stat4Sample *aBe
3210: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  st;       /* Arr
3220: 61 79 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20  ay of nCol best 
3230: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  samples */.  int
3240: 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   iMin;          
3250: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3260: 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20  in a[] of entry 
3270: 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f  with minimum sco
3280: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d  re */.  int nSam
3290: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
32a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
32b0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
32c0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65  /.  int nMaxEqZe
32d0: 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ro;           /*
32e0: 20 4d 61 78 20 6c 65 61 64 69 6e 67 20 30 20 69   Max leading 0 i
32f0: 6e 20 61 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79  n anEq[] for any
3300: 20 61 5b 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20   a[] entry */.  
3310: 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20 20 20  int iGet;       
3320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3330: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 73 61  ex of current sa
3340: 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20 62 79  mple accessed by
3350: 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20   stat_get() */. 
3360: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b   Stat4Sample *a;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3380: 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20  ray of mxSample 
3390: 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65  Stat4Sample obje
33a0: 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  cts */.  sqlite3
33b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
33d0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d  onnection, for m
33e0: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  alloc() */.};../
33f0: 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  * Reclaim memory
3400: 20 75 73 65 64 20 62 79 20 61 20 53 74 61 74 34   used by a Stat4
3410: 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66  Sample.*/.#ifdef
3420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3430: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3440: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3450: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
3460: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3470: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  p){.  assert( db
3480: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3490: 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71  nRowid ){.    sq
34a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
34b0: 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20  p->u.aRowid);.  
34c0: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b    p->nRowid = 0;
34d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
34e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
34f0: 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66 20 61   BLOB value of a
3500: 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66   ROWID.*/.#ifdef
3510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3520: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3530: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3540: 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33  SetRowid(sqlite3
3550: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3560: 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  e *p, int n, con
3570: 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b 0a 20  st u8 *pData){. 
3580: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69  ;.  if( p->nRowi
35a0: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
35b0: 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69  e(db, p->u.aRowi
35c0: 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69  d);.  p->u.aRowi
35d0: 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  d = sqlite3DbMal
35e0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b  locRawNN(db, n);
35f0: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3600: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
3610: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
3620: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
3630: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
3640: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
3650: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
3660: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3670: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3680: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3690: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
36a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
36b0: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
36c0: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
36d0: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
36e0: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
36f0: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3700: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
3710: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3720: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
3730: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
3740: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
3750: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
3760: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3780: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3790: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
37a0: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
37b0: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
37c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
37e0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
37f0: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3800: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
3810: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
3820: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
3830: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
3840: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
3850: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
3860: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3870: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3880: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3890: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
38a0: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
38b0: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
38c0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
38d0: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
38e0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
38f0: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3900: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
3910: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
3920: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3930: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
3940: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
3950: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
3960: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3970: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3980: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
39a0: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
39b0: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
39c0: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
39d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
39e0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
39f0: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3a00: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
3a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3a20: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
3a30: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
3a40: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
3a50: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
3a60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3a70: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3a80: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3aa0: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3ab0: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3ac0: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3ad0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3ae0: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3af0: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3b00: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
3b10: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
3b20: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3b40: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
3b50: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3b60: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3b70: 74 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e  t(N,K,C) SQL fun
3b80: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
3b90: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3ba0: 72 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20  re:.**     N:   
3bb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3bc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3bd0: 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  dex including th
3be0: 65 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65  e rowid/pk (note
3bf0: 20 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20   1).**     K:   
3c00: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3c10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3c20: 64 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68  dex excluding th
3c30: 65 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20  e rowid/pk..**  
3c40: 20 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d     C:    The num
3c50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
3c60: 68 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32  he index (note 2
3c70: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20  ).**.** Note 1: 
3c80: 20 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20   In the special 
3c90: 63 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65  case of the cove
3ca0: 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ring index that 
3cb0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20  implements a.** 
3cc0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3cd0: 62 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75  ble, N is the nu
3ce0: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
3cf0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74  KEY columns, not
3d00: 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
3d10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3d20: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
3d30: 0a 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69  .** Note 2:  C i
3d40: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
3d50: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 2e  STAT3 and STAT4.
3d60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
3d70: 65 73 20 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72  es on ordinary r
3d80: 6f 77 69 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d  owid tables, N==
3d90: 4b 2b 31 2e 20 20 42 75 74 20 66 6f 72 20 69 6e  K+1.  But for in
3da0: 64 65 78 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48  dexes on.** WITH
3db0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
3dc0: 2c 20 4e 3d 4b 2b 50 20 77 68 65 72 65 20 50 20  , N=K+P where P 
3dd0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3de0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
3df0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
3e00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
3e10: 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
3e20: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
3e40: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
3e50: 61 62 6c 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20  able as N==K as 
3e60: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 0a  a special case..
3e70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3e80: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  ne allocates the
3e90: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
3ea0: 63 74 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72  ct in heap memor
3eb0: 79 2e 20 54 68 65 20 72 65 74 75 72 6e 20 0a 2a  y. The return .*
3ec0: 2a 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  * value is a poi
3ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
3ee0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20  4Accum object.  
3ef0: 54 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  The datatype of 
3f00: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
3f10: 6c 75 65 20 69 73 20 42 4c 4f 42 2c 20 62 75 74  lue is BLOB, but
3f20: 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   it is really ju
3f30: 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  st a pointer to 
3f40: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 0a 2a  the Stat4Accum.*
3f50: 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  * object..*/.sta
3f60: 74 69 63 20 76 6f 69 64 20 73 74 61 74 49 6e 69  tic void statIni
3f70: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t(.  sqlite3_con
3f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
3fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3fb0: 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75  v.){.  Stat4Accu
3fc0: 6d 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  m *p;.  int nCol
3fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4000: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 61 6d 70  index being samp
4010: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  led */.  int nKe
4020: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4040: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
4050: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55  s */.  int nColU
4060: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4070: 20 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72         /* nCol r
4080: 6f 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c  ounded up for al
4090: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ignment */.  int
40a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
40d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
40e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
4110: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  ection */.#ifdef
4120: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4130: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
4140: 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53  int mxSample = S
4150: 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50  QLITE_STAT4_SAMP
4160: 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  LES;.#endif..  /
4170: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72  * Decode the thr
4180: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
4190: 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45  ments */.  UNUSE
41a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
41b0: 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  );.  nCol = sqli
41c0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
41d0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
41e0: 28 20 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43  ( nCol>0 );.  nC
41f0: 6f 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52  olUp = sizeof(tR
4200: 6f 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c  owcnt)<8 ? (nCol
4210: 2b 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20  +1)&~1 : nCol;. 
4220: 20 6e 4b 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74   nKeyCol = sqlit
4230: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4240: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
4250: 20 6e 4b 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29   nKeyCol<=nCol )
4260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
4270: 43 6f 6c 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  Col>0 );..  /* A
4280: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
4290: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
42a0: 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62  he Stat4Accum ob
42b0: 6a 65 63 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69  ject */.  n = si
42c0: 7a 65 6f 66 28 2a 70 29 20 0a 20 20 20 20 2b 20  zeof(*p) .    + 
42d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
42e0: 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20  nColUp          
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34          /* Stat4
4300: 41 63 63 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20  Accum.anEq */.  
4310: 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63    + sizeof(tRowc
4320: 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20  nt)*nColUp      
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4340: 74 61 74 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20  tat4Accum.anDLt 
4350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4360: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4370: 5f 53 54 41 54 34 0a 20 20 20 20 2b 20 73 69 7a  _STAT4.    + siz
4380: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4390: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
43a0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
43b0: 75 6d 2e 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b  um.anLt */.    +
43c0: 20 73 69 7a 65 6f 66 28 53 74 61 74 34 53 61 6d   sizeof(Stat4Sam
43d0: 70 6c 65 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d  ple)*(nCol+mxSam
43e0: 70 6c 65 29 20 20 20 20 20 2f 2a 20 53 74 61 74  ple)     /* Stat
43f0: 34 41 63 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20  4Accum.aBest[], 
4400: 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a  a[] */.    + siz
4410: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e  eof(tRowcnt)*3*n
4420: 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61  ColUp*(nCol+mxSa
4430: 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b  mple).#endif.  ;
4440: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
4450: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
4460: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20  e(context);.  p 
4470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4480: 63 5a 65 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20  cZero(db, n);.  
4490: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
44a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
44b0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
44c0: 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
44d0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20  .  }..  p->db = 
44e0: 64 62 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20  db;.  p->nRow = 
44f0: 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e  0;.  p->nCol = n
4500: 43 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f  Col;.  p->nKeyCo
4510: 6c 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  l = nKeyCol;.  p
4520: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20  ->current.anDLt 
4530: 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31  = (tRowcnt*)&p[1
4540: 5d 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e  ];.  p->current.
4550: 61 6e 45 71 20 3d 20 26 70 2d 3e 63 75 72 72 65  anEq = &p->curre
4560: 6e 74 2e 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d  nt.anDLt[nColUp]
4570: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4580: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4590: 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 75  _STAT4.  {.    u
45a0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45c0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  * Allocated spac
45d0: 65 20 6e 6f 74 20 79 65 74 20 61 73 73 69 67 6e  e not yet assign
45e0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
4610: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
4620: 6f 75 67 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ough p->aSample[
4630: 5d 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65  ] */..    p->iGe
4640: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d  t = -1;.    p->m
4650: 78 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70  xSample = mxSamp
4660: 6c 65 3b 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d  le;.    p->nPSam
4670: 70 6c 65 20 3d 20 28 74 52 6f 77 63 6e 74 29 28  ple = (tRowcnt)(
4680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4690: 74 36 34 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78  t64(argv[2])/(mx
46a0: 53 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29  Sample/3+1) + 1)
46b0: 3b 0a 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74  ;.    p->current
46c0: 2e 61 6e 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72  .anLt = &p->curr
46d0: 65 6e 74 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d  ent.anEq[nColUp]
46e0: 3b 0a 20 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20  ;.    p->iPrn = 
46f0: 30 78 36 38 39 65 39 36 32 64 2a 28 75 33 32 29  0x689e962d*(u32)
4700: 6e 43 6f 6c 20 5e 20 30 78 64 30 39 34 34 35 36  nCol ^ 0xd094456
4710: 35 2a 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  5*(u32)sqlite3_v
4720: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
4730: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74  );.  .    /* Set
4740: 20 75 70 20 74 68 65 20 53 74 61 74 34 41 63 63   up the Stat4Acc
4750: 75 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74  um.a[] and aBest
4760: 5b 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20  [] arrays */.   
4770: 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20   p->a = (struct 
4780: 53 74 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d  Stat4Sample*)&p-
4790: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43  >current.anLt[nC
47a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42  olUp];.    p->aB
47b0: 65 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61  est = &p->a[mxSa
47c0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63  mple];.    pSpac
47d0: 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b  e = (u8*)(&p->a[
47e0: 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b  mxSample+nCol]);
47f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4800: 28 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b  (mxSample+nCol);
4810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4820: 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f  a[i].anEq = (tRo
4830: 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70  wcnt *)pSpace; p
4840: 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66  Space += (sizeof
4850: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c  (tRowcnt) * nCol
4860: 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  Up);.      p->a[
4870: 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63  i].anLt = (tRowc
4880: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
4890: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
48a0: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70  Rowcnt) * nColUp
48b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  );.      p->a[i]
48c0: 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e  .anDLt = (tRowcn
48d0: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
48e0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
48f0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
4900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4910: 72 74 28 20 28 70 53 70 61 63 65 20 2d 20 28 75  rt( (pSpace - (u
4920: 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20  8*)p)==n );.  . 
4930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4940: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4950: 70 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c  p->aBest[i].iCol
4960: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
4970: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74  #endif..  /* Ret
4980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4990: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f   the allocated o
49a0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c  bject to the cal
49b0: 6c 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  ler.  Note that.
49c0: 20 20 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f    ** only the po
49d0: 69 6e 74 65 72 20 28 74 68 65 20 32 6e 64 20 70  inter (the 2nd p
49e0: 61 72 61 6d 65 74 65 72 29 20 6d 61 74 74 65 72  arameter) matter
49f0: 73 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66 20  s.  The size of 
4a00: 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  the object.  ** 
4a10: 28 67 69 76 65 6e 20 62 79 20 74 68 65 20 33 72  (given by the 3r
4a20: 64 20 70 61 72 61 6d 65 74 65 72 29 20 69 73 20  d parameter) is 
4a30: 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64 20 63  never used and c
4a40: 61 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69  an be any positi
4a50: 76 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a  ve.  ** value. *
4a60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4a70: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4a80: 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20   p, sizeof(*p), 
4a90: 73 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29  stat4Destructor)
4aa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.}.static const
4ab0: 20 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69   FuncDef statIni
4ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32  tFuncdef = {.  2
4ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
4ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
4af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
4b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
4b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
4b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
4b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
4b50: 20 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20    statInit,     
4b60: 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a     /* xSFunc */.
4b70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4b80: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
4b90: 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20  */.  0, 0,      
4ba0: 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c        /* xValue,
4bb0: 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22   xInverse */.  "
4bc0: 73 74 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20  stat_init",     
4bd0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30  /* zName */.  {0
4be0: 7d 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.};..#ifdef SQL
4bf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
4c00: 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20  ./*.** pNew and 
4c10: 70 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61  pOld are both ca
4c20: 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69  ndidate non-peri
4c30: 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c  odic samples sel
4c40: 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68  ected for .** th
4c50: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70  e same column (p
4c60: 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d  New->iCol==pOld-
4c70: 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67  >iCol). Ignoring
4c80: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64   this column and
4c90: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
4ca0: 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69   only any traili
4cb0: 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  ng columns and t
4cc0: 68 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76  he sample hash v
4cd0: 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  alue, this.** fu
4ce0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
4cf0: 72 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e  rue if sample pN
4d00: 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66  ew is to be pref
4d10: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
4d20: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
4d30: 64 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65  ds, if we assume
4d40: 20 74 68 61 74 20 74 68 65 20 63 61 72 64 69 6e   that the cardin
4d50: 61 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20 73  alities of the s
4d60: 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d  elected.** colum
4d70: 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70  n for pNew and p
4d80: 4f 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69  Old are equal, i
4d90: 73 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65  s pNew to be pre
4da0: 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64  ferred over pOld
4db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4dc0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
4dd0: 61 74 20 66 6f 72 20 65 61 63 68 20 61 72 67 75  at for each argu
4de0: 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65  ment sample, the
4df0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
4e00: 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79  the anEq[] array
4e10: 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61   from pSample->a
4e20: 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f  nEq[pSample->iCo
4e30: 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65  l+1] onwards are
4e40: 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74   valid. .*/.stat
4e50: 69 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42  ic int sampleIsB
4e60: 65 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61  etterPost(.  Sta
4e70: 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c  t4Accum *pAccum,
4e80: 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20   .  Stat4Sample 
4e90: 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53  *pNew, .  Stat4S
4ea0: 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20  ample *pOld.){. 
4eb0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63   int nCol = pAcc
4ec0: 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  um->nCol;.  int 
4ed0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  i;.  assert( pNe
4ee0: 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69  w->iCol==pOld->i
4ef0: 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  Col );.  for(i=p
4f00: 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e  New->iCol+1; i<n
4f10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
4f20: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f30: 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  >pOld->anEq[i] )
4f40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4f50: 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d  f( pNew->anEq[i]
4f60: 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29  <pOld->anEq[i] )
4f70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4f80: 20 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68   if( pNew->iHash
4f90: 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72  >pOld->iHash ) r
4fa0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
4fb0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
4fc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4fd0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
4fe0: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
4ff0: 74 72 75 65 20 69 66 20 70 4e 65 77 20 69 73 20  true if pNew is 
5000: 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64 20  to be preferred 
5010: 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a  over pOld..**.**
5020: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5030: 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20  ssumes that for 
5040: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61  each argument sa
5050: 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e  mple, the conten
5060: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45  ts of.** the anE
5070: 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70  q[] array from p
5080: 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61  Sample->anEq[pSa
5090: 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61  mple->iCol] onwa
50a0: 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a  rds are valid. .
50b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
50c0: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20  mpleIsBetter(.  
50d0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63  Stat4Accum *pAcc
50e0: 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70  um, .  Stat4Samp
50f0: 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61  le *pNew, .  Sta
5100: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29  t4Sample *pOld.)
5110: 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e  {.  tRowcnt nEqN
5120: 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b  ew = pNew->anEq[
5130: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74  pNew->iCol];.  t
5140: 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20  Rowcnt nEqOld = 
5150: 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d  pOld->anEq[pOld-
5160: 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  >iCol];..  asser
5170: 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70  t( pOld->isPSamp
5180: 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69  le==0 && pNew->i
5190: 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20  sPSample==0 );. 
51a0: 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34   assert( IsStat4
51b0: 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d   || (pNew->iCol=
51c0: 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c  =0 && pOld->iCol
51d0: 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28  ==0) );..  if( (
51e0: 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29  nEqNew>nEqOld) )
51f0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65   return 1;.#ifde
5200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5210: 53 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e  STAT4.  if( nEqN
5220: 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20  ew==nEqOld ){.  
5230: 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c    if( pNew->iCol
5240: 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65  <pOld->iCol ) re
5250: 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
5260: 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d  rn (pNew->iCol==
5270: 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61  pOld->iCol && sa
5280: 6d 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74  mpleIsBetterPost
5290: 28 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70  (pAccum, pNew, p
52a0: 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Old));.  }.  ret
52b0: 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 0;.#else.  r
52c0: 65 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e  eturn (nEqNew==n
52d0: 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69  EqOld && pNew->i
52e0: 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68  Hash>pOld->iHash
52f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
5300: 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  ** Copy the cont
5310: 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a  ents of sample *
5320: 70 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d  pNew into the p-
5330: 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e  >a[] array. If n
5340: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d  ecessary,.** rem
5350: 6f 76 65 20 74 68 65 20 6c 65 61 73 74 20 64 65  ove the least de
5360: 73 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66  sirable sample f
5370: 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61  rom p->a[] to ma
5380: 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74  ke room..*/.stat
5390: 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e  ic void sampleIn
53a0: 73 65 72 74 28 53 74 61 74 34 41 63 63 75 6d 20  sert(Stat4Accum 
53b0: 2a 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20  *p, Stat4Sample 
53c0: 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65  *pNew, int nEqZe
53d0: 72 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70  ro){.  Stat4Samp
53e0: 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b  le *pSample = 0;
53f0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
5400: 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20  ert( IsStat4 || 
5410: 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23  nEqZero==0 );..#
5420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5430: 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53  BLE_STAT4.  /* S
5440: 74 61 74 34 41 63 63 75 6d 2e 6e 4d 61 78 45 71  tat4Accum.nMaxEq
5450: 5a 65 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  Zero is set to t
5460: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
5470: 72 20 6f 66 20 6c 65 61 64 69 6e 67 20 30 0a 20  r of leading 0. 
5480: 20 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68   ** values in th
5490: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 6f  e anEq[] array o
54a0: 66 20 61 6e 79 20 73 61 6d 70 6c 65 20 69 6e 20  f any sample in 
54b0: 53 74 61 74 34 41 63 63 75 6d 2e 61 5b 5d 2e 20  Stat4Accum.a[]. 
54c0: 49 6e 0a 20 20 2a 2a 20 6f 74 68 65 72 20 77 6f  In.  ** other wo
54d0: 72 64 73 2c 20 69 66 20 6e 4d 61 78 45 71 5a 65  rds, if nMaxEqZe
54e0: 72 6f 20 69 73 20 6e 2c 20 74 68 65 6e 20 69 74  ro is n, then it
54f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
5500: 68 61 74 20 74 68 65 72 65 0a 20 20 2a 2a 20 61  hat there.  ** a
5510: 72 65 20 6e 6f 20 73 61 6d 70 6c 65 73 20 77 69  re no samples wi
5520: 74 68 20 53 74 61 74 34 53 61 6d 70 6c 65 2e 61  th Stat4Sample.a
5530: 6e 45 71 5b 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d  nEq[m]==0 for (m
5540: 3e 3d 6e 29 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  >=n). */.  if( n
5550: 45 71 5a 65 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71  EqZero>p->nMaxEq
5560: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  Zero ){.    p->n
5570: 4d 61 78 45 71 5a 65 72 6f 20 3d 20 6e 45 71 5a  MaxEqZero = nEqZ
5580: 65 72 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ero;.  }.  if( p
5590: 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d  New->isPSample==
55a0: 30 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  0 ){.    Stat4Sa
55b0: 6d 70 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d  mple *pUpgrade =
55c0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
55d0: 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d  pNew->anEq[pNew-
55e0: 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20  >iCol]>0 );..   
55f0: 20 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20   /* This sample 
5600: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 62  is being added b
5610: 65 63 61 75 73 65 20 74 68 65 20 70 72 65 66 69  ecause the prefi
5620: 78 20 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63  x that ends in c
5630: 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43  olumn .    ** iC
5640: 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74  ol occurs many t
5650: 69 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  imes in the tabl
5660: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77  e. However, if w
5670: 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
5680: 20 20 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61     ** added a sa
5690: 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73  mple that shares
56a0: 20 74 68 69 73 20 70 72 65 66 69 78 2c 20 74 68   this prefix, th
56b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
56c0: 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69  o add.    ** thi
56d0: 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20  s one. Instead, 
56e0: 75 70 67 72 61 64 65 20 74 68 65 20 70 72 69 6f  upgrade the prio
56f0: 72 69 74 79 20 6f 66 20 74 68 65 20 68 69 67 68  rity of the high
5700: 65 73 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20  est priority.   
5710: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d   ** existing sam
5720: 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20  ple that shares 
5730: 74 68 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f  this prefix.  */
5740: 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
5750: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
5760: 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34  --){.      Stat4
5770: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26  Sample *pOld = &
5780: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  p->a[i];.      i
5790: 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e  f( pOld->anEq[pN
57a0: 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  ew->iCol]==0 ){.
57b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
57c0: 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65  ->isPSample ) re
57d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
57e0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c  sert( pOld->iCol
57f0: 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20  >pNew->iCol );. 
5800: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5810: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c  ampleIsBetter(p,
5820: 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a   pNew, pOld) );.
5830: 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70 67          if( pUpg
5840: 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c  rade==0 || sampl
5850: 65 49 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c  eIsBetter(p, pOl
5860: 64 2c 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a  d, pUpgrade) ){.
5870: 20 20 20 20 20 20 20 20 20 20 70 55 70 67 72 61            pUpgra
5880: 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  de = pOld;.     
5890: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
58a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70 67 72   }.    if( pUpgr
58b0: 61 64 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70  ade ){.      pUp
58c0: 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e  grade->iCol = pN
58d0: 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20  ew->iCol;.      
58e0: 70 55 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70  pUpgrade->anEq[p
58f0: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d  Upgrade->iCol] =
5900: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67   pNew->anEq[pUpg
5910: 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20  rade->iCol];.   
5920: 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77     goto find_new
5930: 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _min;.    }.  }.
5940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
5950: 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76  necessary, remov
5960: 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f  e sample iMin to
5970: 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
5980: 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a  he new sample. *
5990: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  /.  if( p->nSamp
59a0: 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le>=p->mxSample 
59b0: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
59c0: 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61  le *pMin = &p->a
59d0: 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74  [p->iMin];.    t
59e0: 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70  Rowcnt *anEq = p
59f0: 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74  Min->anEq;.    t
5a00: 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70  Rowcnt *anLt = p
5a10: 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74  Min->anLt;.    t
5a20: 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20  Rowcnt *anDLt = 
5a30: 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20  pMin->anDLt;.   
5a40: 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e   sampleClear(p->
5a50: 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d  db, pMin);.    m
5a60: 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d  emmove(pMin, &pM
5a70: 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d  in[1], sizeof(p-
5a80: 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70  >a[0])*(p->nSamp
5a90: 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a  le-p->iMin-1));.
5aa0: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
5ab0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  ->a[p->nSample-1
5ac0: 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  ];.    pSample->
5ad0: 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  nRowid = 0;.    
5ae0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20  pSample->anEq = 
5af0: 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c  anEq;.    pSampl
5b00: 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74  e->anDLt = anDLt
5b10: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61  ;.    pSample->a
5b20: 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20  nLt = anLt;.    
5b30: 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e  p->nSample = p->
5b40: 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a  mxSample-1;.  }.
5b50: 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20  .  /* The "rows 
5b60: 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74  less-than" for t
5b70: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
5b80: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
5b90: 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66  than that.  ** f
5ba0: 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70  or the last samp
5bb0: 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d  le in the p->a[]
5bc0: 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
5bd0: 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77  e, the samples w
5be0: 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74  ould.  ** be out
5bf0: 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69   of order. */.#i
5c00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5c10: 4c 45 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72  LE_STAT4.  asser
5c20: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30  t( p->nSample==0
5c30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77   .       || pNew
5c40: 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->anLt[p->nCol-1
5c50: 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d  ] > p->a[p->nSam
5c60: 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e  ple-1].anLt[p->n
5c70: 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66  Col-1] );.#endif
5c80: 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
5c90: 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a  e new sample */.
5ca0: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
5cb0: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  a[p->nSample];. 
5cc0: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70   sampleCopy(p, p
5cd0: 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20  Sample, pNew);. 
5ce0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a   p->nSample++;..
5cf0: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
5d00: 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72  rst nEqZero entr
5d10: 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b  ies in the anEq[
5d20: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65  ] array. */.  me
5d30: 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e  mset(pSample->an
5d40: 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52  Eq, 0, sizeof(tR
5d50: 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b  owcnt)*nEqZero);
5d60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d70: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69  ENABLE_STAT4. fi
5d80: 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64  nd_new_min:.#end
5d90: 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  if.  if( p->nSam
5da0: 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65  ple>=p->mxSample
5db0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e   ){.    int iMin
5dc0: 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69   = -1;.    for(i
5dd0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
5de0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
5df0: 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61  f( p->a[i].isPSa
5e00: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
5e10: 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c  .      if( iMin<
5e20: 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  0 || sampleIsBet
5e30: 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69  ter(p, &p->a[iMi
5e40: 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b  n], &p->a[i]) ){
5e50: 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  .        iMin = 
5e60: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
5e70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69  .    assert( iMi
5e80: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  n>=0 );.    p->i
5e90: 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a  Min = iMin;.  }.
5ea0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5eb0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
5ec0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
5ed0: 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f  ** Field iChng o
5ee0: 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
5ef0: 67 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68  g scanned has ch
5f00: 61 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69  anged. So at thi
5f10: 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75  s point.** p->cu
5f20: 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61  rrent contains a
5f30: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66   sample that ref
5f40: 6c 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f  lects the previo
5f50: 75 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a  us row of the.**
5f60: 20 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75   index. The valu
5f70: 65 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d  e of anEq[iChng]
5f80: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
5f90: 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20  anEq[] elements 
5fa0: 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61  are.** correct a
5fb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
5fc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d  .static void sam
5fd0: 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28  plePushPrevious(
5fe0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69  Stat4Accum *p, i
5ff0: 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65  nt iChng){.#ifde
6000: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6010: 53 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a  STAT4.  int i;..
6020: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
6030: 79 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74  y samples from t
6040: 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  he aBest[] array
6050: 20 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65   should be pushe
6060: 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65  d.  ** into Inde
6070: 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74  xSample.a[] at t
6080: 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20  his point.  */. 
6090: 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d   for(i=(p->nCol-
60a0: 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d  2); i>=iChng; i-
60b0: 2d 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d  -){.    Stat4Sam
60c0: 70 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d  ple *pBest = &p-
60d0: 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70  >aBest[i];.    p
60e0: 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20  Best->anEq[i] = 
60f0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6100: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
6110: 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70  Sample<p->mxSamp
6120: 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65  le || sampleIsBe
6130: 74 74 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26  tter(p, pBest, &
6140: 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29  p->a[p->iMin]) )
6150: 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e  {.      sampleIn
6160: 73 65 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69  sert(p, pBest, i
6170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
6180: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6e 6f  /* Check that no
6190: 20 73 61 6d 70 6c 65 20 63 6f 6e 74 61 69 6e 73   sample contains
61a0: 20 61 6e 20 61 6e 45 71 5b 5d 20 65 6e 74 72 79   an anEq[] entry
61b0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f   with an index o
61c0: 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71  f.  ** p->nMaxEq
61d0: 5a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20  Zero or greater 
61e0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a  set to zero. */.
61f0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70    for(i=p->nSamp
6200: 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  le-1; i>=0; i--)
6210: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
6220: 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71   for(j=p->nMaxEq
6230: 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  Zero; j<p->nCol;
6240: 20 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   j++) assert( p-
6250: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20  >a[i].anEq[j]>0 
6260: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
6270: 61 74 65 20 74 68 65 20 61 6e 45 71 5b 5d 20 66  ate the anEq[] f
6280: 69 65 6c 64 73 20 6f 66 20 61 6e 79 20 73 61 6d  ields of any sam
6290: 70 6c 65 73 20 61 6c 72 65 61 64 79 20 63 6f 6c  ples already col
62a0: 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20 69 66 28  lected. */.  if(
62b0: 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71   iChng<p->nMaxEq
62c0: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28  Zero ){.    for(
62d0: 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20  i=p->nSample-1; 
62e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
62f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
6300: 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d  or(j=iChng; j<p-
6310: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
6320: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d       if( p->a[i]
6330: 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d  .anEq[j]==0 ) p-
6340: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20  >a[i].anEq[j] = 
6350: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6360: 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
6370: 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a  }.    p->nMaxEqZ
6380: 65 72 6f 20 3d 20 69 43 68 6e 67 3b 0a 20 20 7d  ero = iChng;.  }
6390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
63a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
63b0: 4c 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65  LE_STAT3) && !de
63c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
63d0: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28  BLE_STAT4).  if(
63e0: 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20   iChng==0 ){.   
63f0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
6400: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30  ->current.anLt[0
6410: 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ];.    tRowcnt n
6420: 45 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Eq = p->current.
6430: 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  anEq[0];..    /*
6440: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
6450: 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64  s to be a period
6460: 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f  ic sample. If so
6470: 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20  , add it. */.   
6480: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
6490: 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71  ample)!=(nLt+nEq
64a0: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
64b0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
64c0: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
64d0: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
64e0: 65 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ert(p, &p->curre
64f0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  nt, 0);.      p-
6500: 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70  >current.isPSamp
6510: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
6520: 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66  e ..    /* Or if
6530: 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72   it is a non-per
6540: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64  iodic sample. Ad
6550: 64 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73  d it in this cas
6560: 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66  e too. */.    if
6570: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
6580: 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c  mxSample .     |
6590: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
65a0: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
65b0: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
65c0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
65d0: 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26  ampleInsert(p, &
65e0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a  p->current, 0);.
65f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6600: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6610: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
6620: 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f  _STAT4.  UNUSED_
6630: 50 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a  PARAMETER( p );.
6640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6650: 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e  ER( iChng );.#en
6660: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  dif.}../*.** Imp
6670: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6680: 68 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c  he stat_push SQL
6690: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74   function:  stat
66a0: 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20  _push(P,C,R).** 
66b0: 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  Arguments:.**.**
66c0: 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65      P     Pointe
66d0: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
66e0: 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74  cum object creat
66f0: 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28  ed by stat_init(
6700: 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e  ).**    C     In
6710: 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  dex of left-most
6720: 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65   column to diffe
6730: 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  r from previous 
6740: 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20  row.**    R     
6750: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  Rowid for the cu
6760: 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68  rrent row.  Migh
6770: 74 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72  t be a key recor
6780: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
6790: 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20    WITHOUT ROWID 
67a0: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
67b0: 69 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  is SQL function 
67c0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e  always returns N
67d0: 55 4c 4c 2e 20 20 49 74 27 73 20 70 75 72 70 6f  ULL.  It's purpo
67e0: 73 65 20 69 74 20 74 6f 20 61 63 63 75 6d 75 6c  se it to accumul
67f0: 61 74 65 0a 2a 2a 20 73 74 61 74 69 73 74 69 63  ate.** statistic
6800: 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f 72 20 73  al data and/or s
6810: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 53 74  amples in the St
6820: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
6830: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64  about the.** ind
6840: 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ex being analyze
6850: 64 2e 20 20 54 68 65 20 73 74 61 74 5f 67 65 74  d.  The stat_get
6860: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
6870: 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 75 73  will later be us
6880: 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74  ed to.** extract
6890: 20 72 65 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d   relevant inform
68a0: 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72  ation for constr
68b0: 75 63 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74  ucting the sqlit
68c0: 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a  e_statN tables..
68d0: 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61  **.** The R para
68e0: 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73  meter is only us
68f0: 65 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64  ed for STAT3 and
6900: 20 53 54 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63   STAT4.*/.static
6910: 20 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a   void statPush(.
6920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6960: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
6970: 20 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   The three funct
6980: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
6990: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
69a0: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
69b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
69c0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
69d0: 6e 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74  nt iChng = sqlit
69e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
69f0: 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44  v[1]);..  UNUSED
6a00: 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63  _PARAMETER( argc
6a10: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
6a20: 41 4d 45 54 45 52 28 20 63 6f 6e 74 65 78 74 20  AMETER( context 
6a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6a40: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65  nCol>0 );.  asse
6a50: 72 74 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f  rt( iChng<p->nCo
6a60: 6c 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  l );..  if( p->n
6a70: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Row==0 ){.    /*
6a80: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
6a90: 73 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  st call to this 
6aa0: 66 75 6e 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69  function. Do ini
6ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a  tialization. */.
6ac0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6ad0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e  ->nCol; i++) p->
6ae0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6af0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
6b00: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20    /* Second and 
6b10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
6b20: 20 67 65 74 20 70 72 6f 63 65 73 73 65 64 20 68   get processed h
6b30: 65 72 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c  ere */.    sampl
6b40: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c  ePushPrevious(p,
6b50: 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a   iChng);..    /*
6b60: 20 55 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c   Update anDLt[],
6b70: 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71   anLt[] and anEq
6b80: 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  [] to reflect th
6b90: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 70  e values that ap
6ba0: 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ply.    ** to th
6bb0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
6bc0: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   the index. */. 
6bd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43     for(i=0; i<iC
6be0: 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  hng; i++){.     
6bf0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
6c00: 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]++;.    }.   
6c10: 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c   for(i=iChng; i<
6c20: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6c30: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
6c40: 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64  anDLt[i]++;.#ifd
6c50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6c60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6c70: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6c80: 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63  .anLt[i] += p->c
6c90: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a  urrent.anEq[i];.
6ca0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e  #endif.      p->
6cb0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6cc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
6cd0: 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64   p->nRow++;.#ifd
6ce0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6cf0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6d00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
6d10: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d  lue_type(argv[2]
6d20: 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )==SQLITE_INTEGE
6d30: 52 20 29 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  R ){.    sampleS
6d40: 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e  etRowidInt64(p->
6d50: 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  db, &p->current,
6d60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6d70: 6e 74 36 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a  nt64(argv[2]));.
6d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d    }else{.    sam
6d90: 70 6c 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64  pleSetRowid(p->d
6da0: 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  b, &p->current, 
6db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6dc0: 74 65 73 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20  tes(argv[2]),.  
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6e00: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29  ue_blob(argv[2])
6e10: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72  );.  }.  p->curr
6e20: 65 6e 74 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69  ent.iHash = p->i
6e30: 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31  Prn = p->iPrn*11
6e40: 30 33 35 31 35 32 34 35 20 2b 20 31 32 33 34 35  03515245 + 12345
6e50: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
6e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6e70: 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f  TAT4.  {.    tRo
6e80: 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75  wcnt nLt = p->cu
6e90: 72 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43  rrent.anLt[p->nC
6ea0: 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43  ol-1];..    /* C
6eb0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
6ec0: 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63  to be a periodic
6ed0: 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20   sample. If so, 
6ee0: 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  add it. */.    i
6ef0: 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d  f( (nLt/p->nPSam
6f00: 70 6c 65 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d  ple)!=(nLt+1)/p-
6f10: 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >nPSample ){.   
6f20: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6f30: 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20  PSample = 1;.   
6f40: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43     p->current.iC
6f50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 61  ol = 0;.      sa
6f60: 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70  mpleInsert(p, &p
6f70: 2d 3e 63 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43  ->current, p->nC
6f80: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ol-1);.      p->
6f90: 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c  current.isPSampl
6fa0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
6fb0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6fc0: 61 42 65 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a  aBest[] array. *
6fd0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6fe0: 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b  <(p->nCol-1); i+
6ff0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  +){.      p->cur
7000: 72 65 6e 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20  rent.iCol = i;. 
7010: 20 20 20 20 20 69 66 28 20 69 3e 3d 69 43 68 6e       if( i>=iChn
7020: 67 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  g || sampleIsBet
7030: 74 65 72 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63  terPost(p, &p->c
7040: 75 72 72 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73  urrent, &p->aBes
7050: 74 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t[i]) ){.       
7060: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26   sampleCopy(p, &
7070: 70 2d 3e 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d  p->aBest[i], &p-
7080: 3e 63 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20  >current);.     
7090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
70a0: 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e  dif.}.static con
70b0: 73 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 50  st FuncDef statP
70c0: 75 73 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20  ushFuncdef = {. 
70d0: 20 32 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20   2+IsStat34,    
70e0: 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53    /* nArg */.  S
70f0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20  QLITE_UTF8,     
7100: 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a  /* funcFlags */.
7110: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7120: 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20     /* pUserData 
7130: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7140: 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
7150: 2f 0a 20 20 73 74 61 74 50 75 73 68 2c 20 20 20  /.  statPush,   
7160: 20 20 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a       /* xSFunc *
7170: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
7180: 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a       /* xFinaliz
7190: 65 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20  e */.  0, 0,    
71a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 56 61 6c 75          /* xValu
71b0: 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20  e, xInverse */. 
71c0: 20 22 73 74 61 74 5f 70 75 73 68 22 2c 20 20 20   "stat_push",   
71d0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
71e0: 7b 30 7d 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  {0}.};..#define 
71f0: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 30  STAT_GET_STAT1 0
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 74            /* "st
7210: 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  at" column of st
7220: 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  at1 table */.#de
7230: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 52 4f  fine STAT_GET_RO
7240: 57 49 44 20 31 20 20 20 20 20 20 20 20 20 20 2f  WID 1          /
7250: 2a 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  * "rowid" column
7260: 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74   of stat[34] ent
7270: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ry */.#define ST
7280: 41 54 5f 47 45 54 5f 4e 45 51 20 20 20 32 20 20  AT_GET_NEQ   2  
7290: 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 65 71 22          /* "neq"
72a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b   column of stat[
72b0: 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65  34] entry */.#de
72c0: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c  fine STAT_GET_NL
72d0: 54 20 20 20 33 20 20 20 20 20 20 20 20 20 20 2f  T   3          /
72e0: 2a 20 22 6e 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f  * "nlt" column o
72f0: 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79  f stat[34] entry
7300: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54   */.#define STAT
7310: 5f 47 45 54 5f 4e 44 4c 54 20 20 34 20 20 20 20  _GET_NDLT  4    
7320: 20 20 20 20 20 20 2f 2a 20 22 6e 64 6c 74 22 20        /* "ndlt" 
7330: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
7340: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a  4] entry */../*.
7350: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7360: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 5f 67 65  n of the stat_ge
7370: 74 28 50 2c 4a 29 20 53 51 4c 20 66 75 6e 63 74  t(P,J) SQL funct
7380: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
7390: 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  ne is.** used to
73a0: 20 71 75 65 72 79 20 73 74 61 74 69 73 74 69 63   query statistic
73b0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  al information t
73c0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 67 61 74  hat has been gat
73d0: 68 65 72 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  hered into.** th
73e0: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
73f0: 65 63 74 20 62 79 20 70 72 69 6f 72 20 63 61 6c  ect by prior cal
7400: 6c 73 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28  ls to stat_push(
7410: 29 2e 20 20 54 68 65 20 50 20 70 61 72 61 6d 65  ).  The P parame
7420: 74 65 72 0a 2a 2a 20 68 61 73 20 74 79 70 65 20  ter.** has type 
7430: 42 4c 4f 42 20 62 75 74 20 69 74 20 69 73 20 72  BLOB but it is r
7440: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69  eally just a poi
7450: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
7460: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a  4Accum object..*
7470: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f  * The content to
7480: 20 72 65 74 75 72 6e 65 64 20 69 73 20 64 65 74   returned is det
7490: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
74a0: 61 72 61 6d 65 74 65 72 20 4a 0a 2a 2a 20 77 68  arameter J.** wh
74b0: 69 63 68 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ich is one of th
74c0: 65 20 53 54 41 54 5f 47 45 54 5f 78 78 78 78 20  e STAT_GET_xxxx 
74d0: 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 61  values defined a
74e0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bove..**.** The 
74f0: 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 66 75  stat_get(P,J) fu
7500: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
7510: 61 69 6c 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ailable to gener
7520: 69 63 20 53 51 4c 2e 20 20 49 74 20 69 73 0a 2a  ic SQL.  It is.*
7530: 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
7540: 72 74 20 6f 66 20 61 20 6d 61 6e 75 61 6c 6c 79  rt of a manually
7550: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 74   constructed byt
7560: 65 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20 20  ecode program.  
7570: 28 53 65 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  (See.** the call
7580: 53 74 61 74 47 65 74 28 29 20 72 6f 75 74 69 6e  StatGet() routin
7590: 65 20 62 65 6c 6f 77 2e 29 20 20 49 74 20 69 73  e below.)  It is
75a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
75b0: 20 74 68 65 20 50 0a 2a 2a 20 70 61 72 61 6d 65   the P.** parame
75c0: 74 65 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ter will always 
75d0: 62 65 20 61 20 70 6f 69 6e 65 72 20 74 6f 20 61  be a poiner to a
75e0: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
75f0: 63 74 2c 20 6e 65 76 65 72 20 61 0a 2a 2a 20 4e  ct, never a.** N
7600: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ULL..**.** If ne
7610: 69 74 68 65 72 20 53 54 41 54 33 20 6e 6f 72 20  ither STAT3 nor 
7620: 53 54 41 54 34 20 61 72 65 20 65 6e 61 62 6c 65  STAT4 are enable
7630: 64 2c 20 74 68 65 6e 20 4a 20 69 73 20 61 6c 77  d, then J is alw
7640: 61 79 73 0a 2a 2a 20 53 54 41 54 5f 47 45 54 5f  ays.** STAT_GET_
7650: 53 54 41 54 31 20 61 6e 64 20 69 73 20 68 65 6e  STAT1 and is hen
7660: 63 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  ce omitted and t
7670: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 63 6f  his routine beco
7680: 6d 65 73 0a 2a 2a 20 61 20 6f 6e 65 2d 70 61 72  mes.** a one-par
7690: 61 6d 65 74 65 72 20 66 75 6e 63 74 69 6f 6e 2c  ameter function,
76a0: 20 73 74 61 74 5f 67 65 74 28 50 29 2c 20 74 68   stat_get(P), th
76b0: 61 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  at always return
76c0: 73 20 74 68 65 0a 2a 2a 20 73 74 61 74 31 20 74  s the.** stat1 t
76d0: 61 62 6c 65 20 65 6e 74 72 79 20 69 6e 66 6f 72  able entry infor
76e0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
76f0: 63 20 76 6f 69 64 20 73 74 61 74 47 65 74 28 0a  c void statGet(.
7700: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7710: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7720: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7730: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7740: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
7750: 70 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a  p = (Stat4Accum*
7760: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
7770: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  lob(argv[0]);.#i
7780: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7790: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
77a0: 34 0a 20 20 2f 2a 20 53 54 41 54 33 20 61 6e 64  4.  /* STAT3 and
77b0: 20 53 54 41 54 34 20 68 61 76 65 20 61 20 70 61   STAT4 have a pa
77c0: 72 61 6d 65 74 65 72 20 6f 6e 20 74 68 69 73 20  rameter on this 
77d0: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e  routine. */.  in
77e0: 74 20 65 43 61 6c 6c 20 3d 20 73 71 6c 69 74 65  t eCall = sqlite
77f0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
7800: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
7810: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 61 73 73  argc==2 );.  ass
7820: 65 72 74 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54  ert( eCall==STAT
7830: 5f 47 45 54 5f 53 54 41 54 31 20 7c 7c 20 65 43  _GET_STAT1 || eC
7840: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 45  all==STAT_GET_NE
7850: 51 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61  Q .       || eCa
7860: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7870: 49 44 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41  ID || eCall==STA
7880: 54 5f 47 45 54 5f 4e 4c 54 0a 20 20 20 20 20 20  T_GET_NLT.      
7890: 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f   || eCall==STAT_
78a0: 47 45 54 5f 4e 44 4c 54 20 0a 20 20 29 3b 0a 20  GET_NDLT .  );. 
78b0: 20 69 66 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54   if( eCall==STAT
78c0: 5f 47 45 54 5f 53 54 41 54 31 20 29 0a 23 65 6c  _GET_STAT1 ).#el
78d0: 73 65 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  se.  assert( arg
78e0: 63 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20  c==1 );.#endif. 
78f0: 20 7b 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e   {.    /* Return
7900: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 73 74   the value to st
7910: 6f 72 65 20 69 6e 20 74 68 65 20 22 73 74 61 74  ore in the "stat
7920: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
7930: 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 20 20 20  sqlite_stat1.   
7940: 20 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 74 68   ** table for th
7950: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  is index..    **
7960: 0a 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  .    ** The valu
7970: 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f  e is a string co
7980: 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74  mposed of a list
7990: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 64 65 73   of integers des
79a0: 63 72 69 62 69 6e 67 20 0a 20 20 20 20 2a 2a 20  cribing .    ** 
79b0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 20 66  the index. The f
79c0: 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20  irst integer in 
79d0: 74 68 65 20 6c 69 73 74 20 69 73 20 74 68 65 20  the list is the 
79e0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
79f0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
7a00: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
7a10: 65 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74  ere is one addit
7a20: 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e  ional integer in
7a30: 20 74 68 65 20 6c 69 73 74 20 0a 20 20 20 20 2a   the list .    *
7a40: 2a 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  * for each index
7a50: 65 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ed column. This 
7a60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
7a70: 65 72 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  er is an estimat
7a80: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
7a90: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
7aa0: 61 74 63 68 65 64 20 62 79 20 61 20 73 74 61 62  atched by a stab
7ab0: 62 69 6e 67 20 71 75 65 72 79 20 6f 6e 20 74 68  bing query on th
7ac0: 65 20 69 6e 64 65 78 20 75 73 69 6e 67 0a 20 20  e index using.  
7ad0: 20 20 2a 2a 20 61 20 6b 65 79 20 77 69 74 68 20    ** a key with 
7ae0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7af0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  g number of fiel
7b00: 64 73 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ds. In other wor
7b10: 64 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ds,.    ** if th
7b20: 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 63 6f  e index is on co
7b30: 6c 75 6d 6e 73 20 28 61 2c 62 29 20 61 6e 64 20  lumns (a,b) and 
7b40: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
7b50: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 2a   value is .    *
7b60: 2a 20 22 31 30 30 20 31 30 20 32 22 2c 20 74 68  * "100 10 2", th
7b70: 65 6e 20 53 51 4c 69 74 65 20 65 73 74 69 6d 61  en SQLite estima
7b80: 74 65 73 20 74 68 61 74 3a 0a 20 20 20 20 2a 2a  tes that:.    **
7b90: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 74 68 65 20  .    **   * the 
7ba0: 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 31  index contains 1
7bb0: 30 30 20 72 6f 77 73 2c 0a 20 20 20 20 2a 2a 20  00 rows,.    ** 
7bc0: 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 22 20    * "WHERE a=?" 
7bd0: 6d 61 74 63 68 65 73 20 31 30 20 72 6f 77 73 2c  matches 10 rows,
7be0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 2a 20   and.    **   * 
7bf0: 22 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62  "WHERE a=? AND b
7c00: 3d 3f 22 20 6d 61 74 63 68 65 73 20 32 20 72 6f  =?" matches 2 ro
7c10: 77 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws..    **.    *
7c20: 2a 20 49 66 20 44 20 69 73 20 74 68 65 20 63 6f  * If D is the co
7c30: 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63 74 20  unt of distinct 
7c40: 76 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20  values and K is 
7c50: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7c60: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 6f 77 73   of .    ** rows
7c70: 2c 20 74 68 65 6e 20 65 61 63 68 20 65 73 74 69  , then each esti
7c80: 6d 61 74 65 20 69 73 20 63 6f 6d 70 75 74 65 64  mate is computed
7c90: 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   as:.    **.    
7ca0: 2a 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b  **        I = (K
7cb0: 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2f 0a 20  +D-1)/D.    */. 
7cc0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
7cd0: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 63 68 61 72  int i;..    char
7ce0: 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *zRet = sqlite3
7cf0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 28 70 2d 3e  MallocZero( (p->
7d00: 6e 4b 65 79 43 6f 6c 2b 31 29 2a 32 35 20 29 3b  nKeyCol+1)*25 );
7d10: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
7d20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d30: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7d40: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
7d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7d60: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
7d70: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65  snprintf(24, zRe
7d80: 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29  t, "%llu", (u64)
7d90: 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20  p->nRow);.    z 
7da0: 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33  = zRet + sqlite3
7db0: 53 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a  Strlen30(zRet);.
7dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7dd0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
7de0: 0a 20 20 20 20 20 20 75 36 34 20 6e 44 69 73 74  .      u64 nDist
7df0: 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e  inct = p->curren
7e00: 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a  t.anDLt[i] + 1;.
7e10: 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20 3d        u64 iVal =
7e20: 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69 73   (p->nRow + nDis
7e30: 74 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44 69  tinct - 1) / nDi
7e40: 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73 71  stinct;.      sq
7e50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
7e60: 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20 69  4, z, " %llu", i
7e70: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  Val);.      z +=
7e80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7e90: 28 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (z);.      asser
7ea0: 74 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  t( p->current.an
7eb0: 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a 20  Eq[i] );.    }. 
7ec0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
7ed0: 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20  ='\0' && z>zRet 
7ee0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
7ef0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
7f00: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
7f10: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
7f20: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7f30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
7f40: 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66 28  STAT4.  else if(
7f50: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7f60: 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69 66  _ROWID ){.    if
7f70: 28 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a 20  ( p->iGet<0 ){. 
7f80: 20 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68 50       samplePushP
7f90: 72 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a 20  revious(p, 0);. 
7fa0: 20 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20 30       p->iGet = 0
7fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7fc0: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
7fd0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61 74  le ){.      Stat
7fe0: 34 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70 2d  4Sample *pS = p-
7ff0: 3e 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20 20  >a + p->iGet;.  
8000: 20 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f 77      if( pS->nRow
8010: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  id==0 ){.       
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
8040: 53 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  S->u.iRowid);.  
8050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8070: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
8080: 70 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 53  pS->u.aRowid, pS
8090: 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  ->nRowid,.      
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
80c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
80d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
80e0: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43 6e      tRowcnt *aCn
80f0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  t = 0;..    asse
8100: 72 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e  rt( p->iGet<p->n
8110: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73 77  Sample );.    sw
8120: 69 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a 20  itch( eCall ){. 
8130: 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f 47       case STAT_G
8140: 45 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d 20  ET_NEQ:  aCnt = 
8150: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
8160: 45 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Eq; break;.     
8170: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
8180: 4c 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  LT:  aCnt = p->a
8190: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b 20  [p->iGet].anLt; 
81a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
81b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
81c0: 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69  aCnt = p->a[p->i
81d0: 47 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20 20  Get].anDLt; .   
81e0: 20 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a       p->iGet++;.
81f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8210: 20 20 69 66 28 20 49 73 53 74 61 74 33 20 29 7b    if( IsStat3 ){
8220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8230: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
8240: 65 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b 30  ext, (i64)aCnt[0
8250: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
8260: 20 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20       char *zRet 
8270: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
8280: 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35  ero(p->nCol * 25
8290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65  );.      if( zRe
82a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
82b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
82c0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
82d0: 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xt);.      }else
82e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
82f0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8300: 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20   = zRet;.       
8310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8320: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8340: 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c  rintf(24, z, "%l
8350: 6c 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74 5b  lu ", (u64)aCnt[
8360: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  i]);.          z
8370: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8380: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  n30(z);.        
8390: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
83a0: 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20  ( z[0]=='\0' && 
83b0: 7a 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20 20  z>zRet );.      
83c0: 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a    z[-1] = '\0';.
83d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
83e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
83f0: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
8400: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
8410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8420: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8430: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
8440: 5f 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64 65  _STAT4 */.#ifnde
8450: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8460: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8470: 52 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64 69  R( argc );.#endi
8480: 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  f.}.static const
8490: 20 46 75 6e 63 44 65 66 20 73 74 61 74 47 65 74   FuncDef statGet
84a0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
84b0: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
84c0: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
84d0: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
84e0: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
84f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8500: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
8510: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
8520: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
8530: 20 73 74 61 74 47 65 74 2c 20 20 20 20 20 20 20   statGet,       
8540: 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20    /* xSFunc */. 
8550: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
8560: 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a    /* xFinalize *
8570: 2f 0a 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  /.  0, 0,       
8580: 20 20 20 20 20 2f 2a 20 78 56 61 6c 75 65 2c 20       /* xValue, 
8590: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 22 73  xInverse */.  "s
85a0: 74 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f  tat_get",      /
85b0: 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d  * zName */.  {0}
85c0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
85d0: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62   callStatGet(Vdb
85e0: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61  e *v, int regSta
85f0: 74 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20  t4, int iParam, 
8600: 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61  int regOut){.  a
8610: 73 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72  ssert( regOut!=r
8620: 65 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75  egStat4 && regOu
8630: 74 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b  t!=regStat4+1 );
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8650: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8660: 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64  TAT4.  sqlite3Vd
8670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8680: 6e 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20  nteger, iParam, 
8690: 72 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c  regStat4+1);.#el
86a0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
86b0: 20 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d    assert( iParam
86c0: 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31  ==STAT_GET_STAT1
86d0: 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53   );.#else.  UNUS
86e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50  ED_PARAMETER( iP
86f0: 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20  aram );.#endif. 
8700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8710: 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
8720: 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c  n0, 0, regStat4,
8730: 20 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20   regOut,.       
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
8750: 61 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63  ar*)&statGetFunc
8760: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
8770: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
8780: 68 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49  hangeP5(v, 1 + I
8790: 73 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a  sStat34);.}../*.
87a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
87b0: 20 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73   to do an analys
87c0: 69 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65  is of all indice
87d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
87e0: 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  h.** a single ta
87f0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
8800: 6f 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61  oid analyzeOneTa
8810: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
8820: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
8830: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
8840: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8850: 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69  /* Table whose i
8860: 6e 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65  ndices are to be
8870: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
8880: 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20  ndex *pOnlyIdx, 
8890: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
88a0: 6f 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69  only analyze thi
88b0: 73 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s one index */. 
88c0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
88d0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64    /* Index of Vd
88e0: 62 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72  beCursor that wr
88f0: 69 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  ites the sqlite_
8900: 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20  stat1 table */. 
8910: 20 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20   int iMem,      
8920: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
8930: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
8940: 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20  begin here */.  
8950: 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20  int iTab        
8960: 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
8970: 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  le cursor */.){.
8980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8990: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f  pParse->db;    /
89a0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
89b0: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
89c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
89d0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
89e0: 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  to being analyze
89f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  d */.  int iIdxC
8a00: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
8a10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
8a20: 65 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e  en on index bein
8a30: 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
8a40: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a60: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a  Table cursor */.
8a70: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a90: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
8aa0: 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c  chine being buil
8ab0: 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  t up */.  int i;
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8ae0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8af0: 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20  jZeroRows = -1; 
8b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
8b10: 20 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75   from here if nu
8b20: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20  mber of rows is 
8b30: 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44  zero */.  int iD
8b40: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8b50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8b60: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
8b70: 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20  aining pTab */. 
8b80: 20 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74   u8 needTableCnt
8b90: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 1;         /*
8ba0: 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74   True to count t
8bb0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
8bc0: 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  t regNewRowid = 
8bd0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f  iMem++;    /* Ro
8be0: 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65  wid for the inse
8bf0: 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rted record */. 
8c00: 20 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20   int regStat4 = 
8c10: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a  iMem++;       /*
8c20: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
8c30: 64 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  d Stat4Accum obj
8c40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ect */.  int reg
8c50: 43 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  Chng = iMem++;  
8c60: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8c70: 66 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20  f changed index 
8c80: 66 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20  field */.#ifdef 
8c90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
8ca0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
8cb0: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d  nt regRowid = iM
8cc0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52  em++;       /* R
8cd0: 6f 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61  owid argument pa
8ce0: 73 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73  ssed to stat_pus
8cf0: 68 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  h() */.#endif.  
8d00: 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d  int regTemp = iM
8d10: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20  em++;        /* 
8d20: 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
8d30: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
8d40: 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65  regTabname = iMe
8d50: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8d60: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8d70: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
8d80: 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d  int regIdxname =
8d90: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20   iMem++;     /* 
8da0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
8db0: 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a  ing index name *
8dc0: 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31  /.  int regStat1
8dd0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
8de0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68   /* Value for th
8df0: 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66  e stat column of
8e00: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f   sqlite_stat1 */
8e10: 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d  .  int regPrev =
8e20: 20 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   iMem;          
8e30: 2f 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20  /* MUST BE LAST 
8e40: 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23  (see below) */.#
8e50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e60: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
8e70: 4f 4b 0a 20 20 54 61 62 6c 65 20 2a 70 53 74 61  OK.  Table *pSta
8e80: 74 31 20 3d 20 30 3b 20 0a 23 65 6e 64 69 66 0a  t1 = 0; .#endif.
8e90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
8ea0: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d  = MAX(pParse->nM
8eb0: 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d  em, iMem);.  v =
8ec0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8ed0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8ee0: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61  ==0 || NEVER(pTa
8ef0: 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  b==0) ){.    ret
8f00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
8f10: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  Tab->tnum==0 ){.
8f20: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61      /* Do not ga
8f30: 74 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20  ther statistics 
8f40: 6f 6e 20 76 69 65 77 73 20 6f 72 20 76 69 72 74  on views or virt
8f50: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
8f60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
8f80: 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22  ike("sqlite\\_%"
8f90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 27  , pTab->zName, '
8fa0: 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  \\')==0 ){.    /
8fb0: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
8fc0: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79  statistics on sy
8fd0: 73 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  stem tables */. 
8fe0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8ff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9000: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
9010: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44  exes(db) );.  iD
9020: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
9030: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
9040: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
9050: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
9060: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9070: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
9080: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
9090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
90a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
90b0: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
90c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
90d0: 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  , SQLITE_ANALYZE
90e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
90f0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
9100: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
9110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9120: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
9130: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9140: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
9150: 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64   if( db->xPreUpd
9160: 61 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ateCallback ){. 
9170: 20 20 20 70 53 74 61 74 31 20 3d 20 28 54 61 62     pStat1 = (Tab
9180: 6c 65 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  le*)sqlite3DbMal
9190: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
91a0: 6f 66 28 54 61 62 6c 65 29 20 2b 20 31 33 29 3b  of(Table) + 13);
91b0: 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 31 3d  .    if( pStat1=
91c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
91d0: 20 70 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d   pStat1->zName =
91e0: 20 28 63 68 61 72 2a 29 26 70 53 74 61 74 31 5b   (char*)&pStat1[
91f0: 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
9200: 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73  Stat1->zName, "s
9210: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 31 33  qlite_stat1", 13
9220: 29 3b 0a 20 20 20 20 70 53 74 61 74 31 2d 3e 6e  );.    pStat1->n
9230: 43 6f 6c 20 3d 20 33 3b 0a 20 20 20 20 70 53 74  Col = 3;.    pSt
9240: 61 74 31 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  at1->iPKey = -1;
9250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9260: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
9270: 56 64 62 65 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Vdbe, OP_Noop, 0
9280: 2c 20 30 2c 20 30 2c 28 63 68 61 72 2a 29 70 53  , 0, 0,(char*)pS
9290: 74 61 74 31 2c 50 34 5f 44 59 4e 42 4c 4f 42 29  tat1,P4_DYNBLOB)
92a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
92b0: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72  /* Establish a r
92c0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
92d0: 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61  table at the sha
92e0: 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e  red-cache level.
92f0: 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65   .  ** Open a re
9300: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
9310: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73  n the table. Als
9320: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  o allocate a cur
9330: 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  sor number.  ** 
9340: 74 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e  to use for scann
9350: 69 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64  ing indexes (iId
9360: 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20  xCur). No index 
9370: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
9380: 20 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69   at.  ** this ti
9390: 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20  me though.  */. 
93a0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
93b0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
93c0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
93d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54  ab->zName);.  iT
93e0: 61 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  abCur = iTab++;.
93f0: 20 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62    iIdxCur = iTab
9400: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ++;.  pParse->nT
9410: 61 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  ab = MAX(pParse-
9420: 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20  >nTab, iTab);.  
9430: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
9440: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
9450: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
9460: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c  OpenRead);.  sql
9470: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
9480: 6e 67 28 76 2c 20 72 65 67 54 61 62 6e 61 6d 65  ng(v, regTabname
9490: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
94a0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
94b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
94c0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
94d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  ){.    int nCol;
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9500: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64  f columns in pId
9510: 78 2e 20 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e  x. "N" */.    in
9520: 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20  t addrRewind;   
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9540: 64 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65  ddress of "OP_Re
9550: 77 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f  wind iIdxCur" */
9560: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
9570: 74 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  tRow;           
9580: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
9590: 20 22 6e 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a   "next_row:" */.
95a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
95b0: 7a 49 64 78 4e 61 6d 65 3b 20 20 20 20 20 20 20  zIdxName;       
95c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
95d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
95e0: 74 20 6e 43 6f 6c 54 65 73 74 3b 20 20 20 20 20  t nColTest;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9600: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9610: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 63 68 61   to test for cha
9620: 6e 67 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28  nges */..    if(
9630: 20 70 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e   pOnlyIdx && pOn
9640: 6c 79 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f  lyIdx!=pIdx ) co
9650: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9660: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
9670: 65 72 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62  ere==0 ) needTab
9680: 6c 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  leCnt = 0;.    i
9690: 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
96a0: 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
96b0: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  eyIndex(pIdx) ){
96c0: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
96d0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
96e0: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54     zIdxName = pT
96f0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9700: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c   nColTest = nCol
9710: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
9720: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
9730: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
9740: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49     zIdxName = pI
9750: 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  dx->zName;.     
9760: 20 6e 43 6f 6c 54 65 73 74 20 3d 20 70 49 64 78   nColTest = pIdx
9770: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
9780: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20  pIdx->nKeyCol-1 
9790: 3a 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a  : nCol-1;.    }.
97a0: 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
97b0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 63 6f   the register co
97c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
97d0: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ex name. */.    
97e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
97f0: 74 72 69 6e 67 28 76 2c 20 72 65 67 49 64 78 6e  tring(v, regIdxn
9800: 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a  ame, zIdxName);.
9810: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9820: 28 76 2c 20 22 41 6e 61 6c 79 73 69 73 20 66 6f  (v, "Analysis fo
9830: 72 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e  r %s.%s", pTab->
9840: 7a 4e 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29  zName, zIdxName)
9850: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
9860: 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f  * Pseudo-code fo
9870: 72 20 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c  r loop that call
9880: 73 20 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20  s stat_push():. 
9890: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52     **.    **   R
98a0: 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a  ewind csr.    **
98b0: 20 20 20 69 66 20 65 6f 66 28 63 73 72 29 20 67     if eof(csr) g
98c0: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b  oto end_of_scan;
98d0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
98e0: 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67  g = 0.    **   g
98f0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b  oto chng_addr_0;
9900: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9910: 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a  next_row:.    **
9920: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20     regChng = 0. 
9930: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
9940: 30 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29  0) != regPrev(0)
9950: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
9960: 72 5f 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  r_0.    **   reg
9970: 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20  Chng = 1.    ** 
9980: 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d 20    if( idx(1) != 
9990: 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f 74  regPrev(1) ) got
99a0: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20  o chng_addr_1.  
99b0: 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a    **   ....    *
99c0: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a  *   regChng = N.
99d0: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68      **   goto ch
99e0: 6e 67 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a  ng_addr_N.    **
99f0: 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64  .    **  chng_ad
9a00: 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72  dr_0:.    **   r
9a10: 65 67 50 72 65 76 28 30 29 20 3d 20 69 64 78 28  egPrev(0) = idx(
9a20: 30 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  0).    **  chng_
9a30: 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20  addr_1:.    **  
9a40: 20 72 65 67 50 72 65 76 28 31 29 20 3d 20 69 64   regPrev(1) = id
9a50: 78 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e  x(1).    **  ...
9a60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
9a70: 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 3a  endDistinctTest:
9a80: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77  .    **   regRow
9a90: 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 0a  id = idx(rowid).
9aa0: 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75      **   stat_pu
9ab0: 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72  sh(P, regChng, r
9ac0: 65 67 52 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20  egRowid).    ** 
9ad0: 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a    Next csr.    *
9ae0: 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72 29  *   if !eof(csr)
9af0: 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a   goto next_row;.
9b00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65      **.    **  e
9b10: 6e 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20  nd_of_scan:.    
9b20: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
9b30: 73 75 72 65 20 74 68 65 72 65 20 61 72 65 20 65  sure there are e
9b40: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c  nough memory cel
9b50: 6c 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ls allocated to 
9b60: 61 63 63 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20  accommodate .   
9b70: 20 2a 2a 20 74 68 65 20 72 65 67 50 72 65 76 20   ** the regPrev 
9b80: 61 72 72 61 79 20 61 6e 64 20 61 20 74 72 61 69  array and a trai
9b90: 6c 69 6e 67 20 72 6f 77 69 64 20 28 74 68 65 20  ling rowid (the 
9ba0: 72 6f 77 69 64 20 73 6c 6f 74 20 69 73 20 72 65  rowid slot is re
9bb0: 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 77 68  quired.    ** wh
9bc0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 61 20 72 65  en building a re
9bd0: 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69  cord to insert i
9be0: 6e 74 6f 20 74 68 65 20 73 61 6d 70 6c 65 20 63  nto the sample c
9bf0: 6f 6c 75 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a  olumn of .    **
9c00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
9c10: 34 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  4 table.  */.   
9c20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9c30: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
9c40: 2c 20 72 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65  , regPrev+nColTe
9c50: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  st);..    /* Ope
9c60: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
9c70: 72 73 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65  rsor on the inde
9c80: 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  x being analyzed
9c90: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
9ca0: 20 69 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68   iDb==sqlite3Sch
9cb0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
9cc0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  Idx->pSchema) );
9cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ce0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
9cf0: 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
9d00: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
9d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9d20: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
9d30: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
9d40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
9d50: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
9d60: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  me));..    /* In
9d70: 76 6f 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e  voke the stat_in
9d80: 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54  it() function. T
9d90: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
9da0: 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  :.    ** .    **
9db0: 20 20 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62      (1) the numb
9dc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9dd0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75   the index inclu
9de0: 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20  ding the rowid. 
9df0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 6f 72     **        (or
9e00: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
9e10: 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 20  OWID table, the 
9e20: 6e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c  number of PK col
9e30: 75 6d 6e 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20  umns),.    **   
9e40: 20 28 32 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (2) the number 
9e50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9e60: 65 20 6b 65 79 20 77 69 74 68 6f 75 74 20 74 68  e key without th
9e70: 65 20 72 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a  e rowid/pk.    *
9e80: 2a 20 20 20 20 28 33 29 20 74 68 65 20 6e 75 6d  *    (3) the num
9e90: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
9ea0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
9eb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
9ec0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
9ed0: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  t is only used f
9ee0: 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  or STAT3 and STA
9ef0: 54 34 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  T4.    */.#ifdef
9f00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9f10: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
9f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f30: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
9f40: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
9f50: 74 34 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t4+3);.#endif.  
9f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9f80: 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74  r, nCol, regStat
9f90: 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
9fa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9fb0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
9fc0: 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61  >nKeyCol, regSta
9fd0: 74 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+2);.    sqlit
9fe0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9ff0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
a000: 20 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67   regStat4+1, reg
a010: 53 74 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20  Stat4,.         
a020: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
a030: 72 2a 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63  r*)&statInitFunc
a040: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
a050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a060: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
a070: 73 53 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f  sStat34);..    /
a080: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
a090: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a0a0: 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
a0b0: 20 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20     Rewind csr.  
a0c0: 20 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73    **   if eof(cs
a0d0: 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73  r) goto end_of_s
a0e0: 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65  can;.    **   re
a0f0: 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a  gChng = 0.    **
a100: 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73     goto next_pus
a110: 68 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  h_0;.    **.    
a120: 2a 2f 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e  */.    addrRewin
a130: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
a140: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
a150: 6e 64 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20  nd, iIdxCur);.  
a160: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a180: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a190: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68  nteger, 0, regCh
a1a0: 6e 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78  ng);.    addrNex
a1b0: 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
a1c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a1d0: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54  ;..    if( nColT
a1e0: 65 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  est>0 ){.      i
a1f0: 6e 74 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65  nt endDistinctTe
a200: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
a210: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
a220: 20 20 20 20 69 6e 74 20 2a 61 47 6f 74 6f 43 68      int *aGotoCh
a230: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
a240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a 75    /* Array of ju
a250: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  mp instruction a
a260: 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 20 20  ddresses */.    
a270: 20 20 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71    aGotoChng = sq
a280: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
a290: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
a2a0: 74 29 2a 6e 43 6f 6c 54 65 73 74 29 3b 0a 20 20  t)*nColTest);.  
a2b0: 20 20 20 20 69 66 28 20 61 47 6f 74 6f 43 68 6e      if( aGotoChn
a2c0: 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  g==0 ) continue;
a2d0: 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  ..      /*.     
a2e0: 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a 20   **  next_row:. 
a2f0: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e       **   regChn
a300: 67 20 3d 20 30 0a 20 20 20 20 20 20 2a 2a 20 20  g = 0.      **  
a310: 20 69 66 28 20 69 64 78 28 30 29 20 21 3d 20 72   if( idx(0) != r
a320: 65 67 50 72 65 76 28 30 29 20 29 20 67 6f 74 6f  egPrev(0) ) goto
a330: 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20   chng_addr_0.   
a340: 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20     **   regChng 
a350: 3d 20 31 0a 20 20 20 20 20 20 2a 2a 20 20 20 69  = 1.      **   i
a360: 66 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67  f( idx(1) != reg
a370: 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63  Prev(1) ) goto c
a380: 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 20  hng_addr_1.     
a390: 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 20 20   **   ....      
a3a0: 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e  **   regChng = N
a3b0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f  .      **   goto
a3c0: 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74   endDistinctTest
a3d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a3e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a3f0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
a400: 20 20 20 20 20 61 64 64 72 4e 65 78 74 52 6f 77       addrNextRow
a410: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
a420: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
a430: 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65 73 74      if( nColTest
a440: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65  ==1 && pIdx->nKe
a450: 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69  yCol==1 && IsUni
a460: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
a470: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
a480: 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e   a single-column
a490: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 6f   UNIQUE index, o
a4a0: 6e 63 65 20 77 65 20 68 61 76 65 20 66 6f 75 6e  nce we have foun
a4b0: 64 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 20 20 20  d a non-NULL.   
a4c0: 20 20 20 20 20 2a 2a 20 72 6f 77 2c 20 77 65 20       ** row, we 
a4d0: 6b 6e 6f 77 20 74 68 61 74 20 61 6c 6c 20 74 68  know that all th
a4e0: 65 20 72 65 73 74 20 77 69 6c 6c 20 62 65 20 64  e rest will be d
a4f0: 69 73 74 69 6e 63 74 2c 20 73 6f 20 73 6b 69 70  istinct, so skip
a500: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
a510: 73 65 71 75 65 6e 74 20 64 69 73 74 69 6e 63 74  sequent distinct
a520: 6e 65 73 73 20 74 65 73 74 73 2e 20 2a 2f 0a 20  ness tests. */. 
a530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a540: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a550: 6f 74 4e 75 6c 6c 2c 20 72 65 67 50 72 65 76 2c  otNull, regPrev,
a560: 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74   endDistinctTest
a570: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
a580: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a590: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
a5a0: 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20 69  0; i<nColTest; i
a5b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
a5c0: 72 20 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72  r *pColl = (char
a5d0: 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  *)sqlite3LocateC
a5e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a5f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b  Idx->azColl[i]);
a600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a610: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a620: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 72 65 67  _Integer, i, reg
a630: 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 73  Chng);.        s
a640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a650: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
a660: 49 64 78 43 75 72 2c 20 69 2c 20 72 65 67 54 65  IdxCur, i, regTe
a670: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 47 6f  mp);.        aGo
a680: 74 6f 43 68 6e 67 5b 69 5d 20 3d 20 0a 20 20 20  toChng[i] = .   
a690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a6a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
a6b0: 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 72 65 67   regTemp, 0, reg
a6c0: 50 72 65 76 2b 69 2c 20 70 43 6f 6c 6c 2c 20 50  Prev+i, pColl, P
a6d0: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
a6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a6f0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
a700: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
a710: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a720: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
a730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a740: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
a750: 72 2c 20 6e 43 6f 6c 54 65 73 74 2c 20 72 65 67  r, nColTest, reg
a760: 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  Chng);.      sql
a770: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
a780: 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 29  endDistinctTest)
a790: 3b 0a 20 20 0a 20 20 0a 20 20 20 20 20 20 2f 2a  ;.  .  .      /*
a7a0: 0a 20 20 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  .      **  chng_
a7b0: 61 64 64 72 5f 30 3a 0a 20 20 20 20 20 20 2a 2a  addr_0:.      **
a7c0: 20 20 20 72 65 67 50 72 65 76 28 30 29 20 3d 20     regPrev(0) = 
a7d0: 69 64 78 28 30 29 0a 20 20 20 20 20 20 2a 2a 20  idx(0).      ** 
a7e0: 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20   chng_addr_1:.  
a7f0: 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76      **   regPrev
a800: 28 31 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20  (1) = idx(1).   
a810: 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 20     **  ....     
a820: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a830: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a840: 20 61 64 64 72 4e 65 78 74 52 6f 77 2d 31 29 3b   addrNextRow-1);
a850: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a860: 69 3c 6e 43 6f 6c 54 65 73 74 3b 20 69 2b 2b 29  i<nColTest; i++)
a870: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a880: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a890: 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a   aGotoChng[i]);.
a8a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a8b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a8c0: 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
a8d0: 20 69 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a   i, regPrev+i);.
a8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a8f0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a900: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 44 69 73 74  Label(v, endDist
a910: 69 6e 63 74 54 65 73 74 29 3b 0a 20 20 20 20 20  inctTest);.     
a920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a930: 62 2c 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a 20  b, aGotoChng);. 
a940: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 0a 20     }.  .    /*. 
a950: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
a960: 5f 4e 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _N:.    **   reg
a970: 52 6f 77 69 64 20 3d 20 69 64 78 28 72 6f 77 69  Rowid = idx(rowi
a980: 64 29 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  d)            //
a990: 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20   STAT34 only.   
a9a0: 20 2a 2a 20 20 20 73 74 61 74 5f 70 75 73 68 28   **   stat_push(
a9b0: 50 2c 20 72 65 67 43 68 6e 67 2c 20 72 65 67 52  P, regChng, regR
a9c0: 6f 77 69 64 29 20 20 2f 2f 20 33 72 64 20 70 61  owid)  // 3rd pa
a9d0: 72 61 6d 65 74 65 72 20 53 54 41 54 33 34 20 6f  rameter STAT34 o
a9e0: 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78  nly.    **   Nex
a9f0: 74 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69  t csr.    **   i
aa00: 66 20 21 65 6f 66 28 63 73 72 29 20 67 6f 74 6f  f !eof(csr) goto
aa10: 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a   next_row;.    *
aa20: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
aa30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
aa40: 53 54 41 54 34 0a 20 20 20 20 61 73 73 65 72 74  STAT4.    assert
aa50: 28 20 72 65 67 52 6f 77 69 64 3d 3d 28 72 65 67  ( regRowid==(reg
aa60: 53 74 61 74 34 2b 32 29 20 29 3b 0a 20 20 20 20  Stat4+2) );.    
aa70: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
aa80: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
aa90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aaa0: 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
aab0: 64 78 43 75 72 2c 20 72 65 67 52 6f 77 69 64 29  dxCur, regRowid)
aac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aad0: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
aae0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
aaf0: 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
ab00: 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ble);.      int 
ab10: 6a 2c 20 6b 2c 20 72 65 67 4b 65 79 3b 0a 20 20  j, k, regKey;.  
ab20: 20 20 20 20 72 65 67 4b 65 79 20 3d 20 73 71 6c      regKey = sql
ab30: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
ab40: 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b  (pParse, pPk->nK
ab50: 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f  eyCol);.      fo
ab60: 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
ab70: 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
ab80: 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33       k = sqlite3
ab90: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
aba0: 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
abb0: 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 61  n[j]);.        a
abc0: 73 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b  ssert( k>=0 && k
abd0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
abe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
abf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ac00: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
ac10: 72 2c 20 6b 2c 20 72 65 67 4b 65 79 2b 6a 29 3b  r, k, regKey+j);
ac20: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
ac30: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
ac40: 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61  Tab->aCol[pPk->a
ac50: 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
ac60: 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
ac70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ac80: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
ac90: 65 63 6f 72 64 2c 20 72 65 67 4b 65 79 2c 20 70  ecord, regKey, p
aca0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67  Pk->nKeyCol, reg
acb0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
acc0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
acd0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
ace0: 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  gKey, pPk->nKeyC
acf0: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ol);.    }.#endi
ad00: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  f.    assert( re
ad10: 67 43 68 6e 67 3d 3d 28 72 65 67 53 74 61 74 34  gChng==(regStat4
ad20: 2b 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  +1) );.    sqlit
ad30: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ad40: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 31 2c  OP_Function0, 1,
ad50: 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 54 65   regStat4, regTe
ad60: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
ad70: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
ad80: 26 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66  &statPushFuncdef
ad90: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
ada0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
adb0: 61 6e 67 65 50 35 28 76 2c 20 32 2b 49 73 53 74  angeP5(v, 2+IsSt
adc0: 61 74 33 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  at34);.    sqlit
add0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ade0: 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72  OP_Next, iIdxCur
adf0: 2c 20 61 64 64 72 4e 65 78 74 52 6f 77 29 3b 20  , addrNextRow); 
ae00: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ae10: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
ae20: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 73 74   entry to the st
ae30: 61 74 31 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  at1 table. */.  
ae40: 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c    callStatGet(v,
ae50: 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f   regStat4, STAT_
ae60: 47 45 54 5f 53 54 41 54 31 2c 20 72 65 67 53 74  GET_STAT1, regSt
ae70: 61 74 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  at1);.    assert
ae80: 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53 51 4c 49  ( "BBB"[0]==SQLI
ae90: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
aea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aeb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
aec0: 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d  ecord, regTabnam
aed0: 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20 22  e, 3, regTemp, "
aee0: 42 42 42 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  BBB", 0);.    sq
aef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
af00: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
af10: 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65 77  iStatCur, regNew
af20: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
af30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
af40: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
af50: 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20 72  tCur, regTemp, r
af60: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 23 69 66  egNewRowid);.#if
af70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
af80: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
af90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
afa0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
afb0: 28 63 68 61 72 2a 29 70 53 74 61 74 31 2c 20 50  (char*)pStat1, P
afc0: 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e 64 69 66  4_TABLE);.#endif
afd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
afe0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
aff0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20  AG_APPEND);..   
b000: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72   /* Add the entr
b010: 69 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 33  ies to the stat3
b020: 20 6f 72 20 73 74 61 74 34 20 74 61 62 6c 65 2e   or stat4 table.
b030: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
b040: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
b050: 52 5f 53 54 41 54 34 0a 20 20 20 20 7b 0a 20 20  R_STAT4.    {.  
b060: 20 20 20 20 69 6e 74 20 72 65 67 45 71 20 3d 20      int regEq = 
b070: 72 65 67 53 74 61 74 31 3b 0a 20 20 20 20 20 20  regStat1;.      
b080: 69 6e 74 20 72 65 67 4c 74 20 3d 20 72 65 67 53  int regLt = regS
b090: 74 61 74 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e  tat1+1;.      in
b0a0: 74 20 72 65 67 44 4c 74 20 3d 20 72 65 67 53 74  t regDLt = regSt
b0b0: 61 74 31 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74  at1+2;.      int
b0c0: 20 72 65 67 53 61 6d 70 6c 65 20 3d 20 72 65 67   regSample = reg
b0d0: 53 74 61 74 31 2b 33 3b 0a 20 20 20 20 20 20 69  Stat1+3;.      i
b0e0: 6e 74 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 53  nt regCol = regS
b0f0: 74 61 74 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e  tat1+4;.      in
b100: 74 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  t regSampleRowid
b110: 20 3d 20 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c   = regCol + nCol
b120: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
b130: 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Next;.      int 
b140: 61 64 64 72 49 73 4e 75 6c 6c 3b 0a 20 20 20 20  addrIsNull;.    
b150: 20 20 75 38 20 73 65 65 6b 4f 70 20 3d 20 48 61    u8 seekOp = Ha
b160: 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 4f  sRowid(pTab) ? O
b170: 50 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f 50  P_NotExists : OP
b180: 5f 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 20 20  _NotFound;..    
b190: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
b1a0: 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65   MAX(pParse->nMe
b1b0: 6d 2c 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 29 3b  m, regCol+nCol);
b1c0: 0a 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  ..      addrNext
b1d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
b1e0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
b1f0: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
b200: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
b210: 54 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65 67  T_GET_ROWID, reg
b220: 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20  SampleRowid);.  
b230: 20 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d      addrIsNull =
b240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b250: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
b260: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29   regSampleRowid)
b270: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
b280: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 63  rage(v);.      c
b290: 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65  allStatGet(v, re
b2a0: 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54  gStat4, STAT_GET
b2b0: 5f 4e 45 51 2c 20 72 65 67 45 71 29 3b 0a 20 20  _NEQ, regEq);.  
b2c0: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
b2d0: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
b2e0: 54 5f 47 45 54 5f 4e 4c 54 2c 20 72 65 67 4c 74  T_GET_NLT, regLt
b2f0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b300: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b310: 2c 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 2c  , STAT_GET_NDLT,
b320: 20 72 65 67 44 4c 74 29 3b 0a 20 20 20 20 20 20   regDLt);.      
b330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b340: 34 49 6e 74 28 76 2c 20 73 65 65 6b 4f 70 2c 20  4Int(v, seekOp, 
b350: 69 54 61 62 43 75 72 2c 20 61 64 64 72 4e 65 78  iTabCur, addrNex
b360: 74 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69  t, regSampleRowi
b370: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  d, 0);.      Vdb
b380: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 69  eCoverage(v);.#i
b390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b3a0: 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20 73  LE_STAT3.      s
b3b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
b3c0: 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70 50  adIndexColumn(pP
b3d0: 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61 62  arse, pIdx, iTab
b3e0: 43 75 72 2c 20 30 2c 20 72 65 67 53 61 6d 70 6c  Cur, 0, regSampl
b3f0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  e);.#else.      
b400: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
b410: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
b420: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
b430: 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70 50  adIndexColumn(pP
b440: 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61 62  arse, pIdx, iTab
b450: 43 75 72 2c 20 69 2c 20 72 65 67 43 6f 6c 2b 69  Cur, i, regCol+i
b460: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b480: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b490: 6f 72 64 2c 20 72 65 67 43 6f 6c 2c 20 6e 43 6f  ord, regCol, nCo
b4a0: 6c 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a 23  l, regSample);.#
b4b0: 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
b4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b4d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b4e0: 72 65 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20 72  regTabname, 6, r
b4f0: 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  egTemp);.      s
b500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b510: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b520: 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67   iStatCur+1, reg
b530: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  NewRowid);.     
b540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b550: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
b560: 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67   iStatCur+1, reg
b570: 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69  Temp, regNewRowi
b580: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b590: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b5a0: 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64 64 72 4e  P_Goto, 1, addrN
b5b0: 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d 31 20 66  ext); /* P1==1 f
b5c0: 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 2a  or end-of-loop *
b5d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
b5e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b5f0: 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  ddrIsNull);.    
b600: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b610: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
b620: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 20  OR_STAT4 */..   
b630: 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6e 61 6c 79   /* End of analy
b640: 73 69 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  sis */.    sqlit
b650: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b660: 2c 20 61 64 64 72 52 65 77 69 6e 64 29 3b 0a 20  , addrRewind);. 
b670: 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   }...  /* Create
b680: 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65   a single sqlite
b690: 5f 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f 6e  _stat1 entry con
b6a0: 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20  taining NULL as 
b6b0: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6e  the index.  ** n
b6c0: 61 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77 20  ame and the row 
b6d0: 63 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f 6e  count as the con
b6e0: 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tent..  */.  if(
b6f0: 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26 20   pOnlyIdx==0 && 
b700: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b 0a  needTableCnt ){.
b710: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b720: 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e  (v, "%s", pTab->
b730: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
b740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b750: 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61 62  , OP_Count, iTab
b760: 43 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b 0a  Cur, regStat1);.
b770: 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20      jZeroRows = 
b780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b790: 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
b7a0: 65 67 53 74 61 74 31 29 3b 20 56 64 62 65 43 6f  egStat1); VdbeCo
b7b0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
b7c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7d0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b7e0: 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20 20  regIdxname);.   
b7f0: 20 61 73 73 65 72 74 28 20 22 42 42 42 22 5b 30   assert( "BBB"[0
b800: 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ]==SQLITE_AFF_TE
b810: 58 54 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  XT );.    sqlite
b820: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
b830: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b840: 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67  gTabname, 3, reg
b850: 54 65 6d 70 2c 20 22 42 42 42 22 2c 20 30 29 3b  Temp, "BBB", 0);
b860: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b870: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
b880: 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c  Rowid, iStatCur,
b890: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
b8a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b8b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
b8c0: 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  t, iStatCur, reg
b8d0: 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69  Temp, regNewRowi
b8e0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
b8f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
b900: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 23  PFLAG_APPEND);.#
b910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b920: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
b930: 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  OK.    sqlite3Vd
b940: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
b950: 2c 20 28 63 68 61 72 2a 29 70 53 74 61 74 31 2c  , (char*)pStat1,
b960: 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e 64   P4_TABLE);.#end
b970: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
b980: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a  beJumpHere(v, jZ
b990: 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a  eroRows);.  }.}.
b9a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b9b0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
b9c0: 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72  cause the most r
b9d0: 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c  ecent index anal
b9e0: 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f  ysis to.** be lo
b9f0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e  aded into intern
ba00: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 77  al hash tables w
ba10: 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20 75  here is can be u
ba20: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
ba30: 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73  oid loadAnalysis
ba40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ba50: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
ba60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
ba70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ba80: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
ba90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
baa0: 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  , OP_LoadAnalysi
bab0: 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  s, iDb);.  }.}..
bac0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
bad0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f  ode that will do
bae0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
baf0: 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  an entire databa
bb00: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  se.*/.static voi
bb10: 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73  d analyzeDatabas
bb20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
bb30: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
bb40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bb50: 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20  e->db;.  Schema 
bb60: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
bb70: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
bb80: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
bb90: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f   database iDb */
bba0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a  .  HashElem *k;.
bbb0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a    int iStatCur;.
bbc0: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e    int iMem;.  in
bbd0: 74 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74  t iTab;..  sqlit
bbe0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
bbf0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
bc00: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
bc10: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
bc20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
bc30: 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61   += 3;.  openSta
bc40: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  tTable(pParse, i
bc50: 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30 2c  Db, iStatCur, 0,
bc60: 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50   0);.  iMem = pP
bc70: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
bc80: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
bc90: 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Tab;.  assert( s
bca0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
bcb0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
bcc0: 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c  ) );.  for(k=sql
bcd0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
bce0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
bcf0: 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
bd00: 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61  Next(k)){.    Ta
bd10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
bd20: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
bd30: 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79  ta(k);.    analy
bd40: 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73  zeOneTable(pPars
bd50: 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74 61  e, pTab, 0, iSta
bd60: 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62  tCur, iMem, iTab
bd70: 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61  );.  }.  loadAna
bd80: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
bd90: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
bda0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
bdb0: 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79  will do an analy
bdc0: 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sis of a single 
bdd0: 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61  table in.** a da
bde0: 74 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c  tabase.  If pOnl
bdf0: 79 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  yIdx is not NULL
be00: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73 69   then it is a si
be10: 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e  ngle index.** in
be20: 20 70 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c   pTab that shoul
be30: 64 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  d be analyzed..*
be40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
be50: 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65  alyzeTable(Parse
be60: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
be70: 2a 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f  *pTab, Index *pO
be80: 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69  nlyIdx){.  int i
be90: 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43  Db;.  int iStatC
bea0: 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ur;..  assert( p
beb0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
bec0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
bed0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
bee0: 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20  pParse->db) );. 
bef0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
bf00: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
bf10: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
bf20: 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
bf30: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
bf40: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
bf50: 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72  iDb);.  iStatCur
bf60: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
bf70: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
bf80: 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c  += 3;.  if( pOnl
bf90: 79 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e  yIdx ){.    open
bfa0: 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65  StatTable(pParse
bfb0: 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c  , iDb, iStatCur,
bfc0: 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65   pOnlyIdx->zName
bfd0: 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73  , "idx");.  }els
bfe0: 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54  e{.    openStatT
bff0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
c000: 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62  , iStatCur, pTab
c010: 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b  ->zName, "tbl");
c020: 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e  .  }.  analyzeOn
c030: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c040: 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69  Tab, pOnlyIdx, i
c050: 53 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d 3e  StatCur,pParse->
c060: 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e  nMem+1,pParse->n
c070: 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c  Tab);.  loadAnal
c080: 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62  ysis(pParse, iDb
c090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
c0a0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
c0b0: 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
c0c0: 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63  d.  The parser c
c0d0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
c0e0: 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63  e.** when it rec
c0f0: 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59  ognizes an ANALY
c100: 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
c110: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
c140: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
c150: 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20  ZE  <database>  
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
c170: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41   2.**        ANA
c180: 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65  LYZE  ?<database
c190: 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
c1a0: 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 3.**.** Form 
c1b0: 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
c1c0: 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
c1d0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
c1e0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  o be analyzed..*
c1f0: 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65  * Form 2 analyze
c200: 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68  s all indices th
c210: 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  e single databas
c220: 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d  e named..** Form
c230: 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20   3 analyzes all 
c240: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
c250: 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
c260: 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  d table..*/.void
c270: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28   sqlite3Analyze(
c280: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c290: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
c2a0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
c2b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c2c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
c2d0: 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  iDb;.  int i;.  
c2e0: 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20  char *z, *zDb;. 
c2f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
c300: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 54  Index *pIdx;.  T
c310: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
c320: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
c330: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
c340: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
c350: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
c360: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
c370: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
c380: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
c390: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
c3a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
c3b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
c3c0: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
c3d0: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53  ->db) );.  if( S
c3e0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
c3f0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
c400: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
c410: 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
c420: 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70  ( pName2!=0 || p
c430: 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66  Name1==0 );.  if
c440: 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
c450: 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41     /* Form 1:  A
c460: 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e  nalyze everythin
c470: 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  g */.    for(i=0
c480: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
c490: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
c4a0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  1 ) continue;  /
c4b0: 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65  * Do not analyze
c4c0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
c4d0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c  se */.      anal
c4e0: 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72  yzeDatabase(pPar
c4f0: 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
c500: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
c510: 2d 3e 6e 3d 3d 30 20 26 26 20 28 69 44 62 20 3d  ->n==0 && (iDb =
c520: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
c530: 62 2c 20 70 4e 61 6d 65 31 29 29 3e 3d 30 20 29  b, pName1))>=0 )
c540: 7b 0a 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  {.    /* Analyze
c550: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
c560: 64 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  d as the argumen
c570: 74 20 2a 2f 0a 20 20 20 20 61 6e 61 6c 79 7a 65  t */.    analyze
c580: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 2c  Database(pParse,
c590: 20 69 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iDb);.  }else{.
c5a0: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41      /* Form 3: A
c5b0: 6e 61 6c 79 7a 65 20 74 68 65 20 74 61 62 6c 65  nalyze the table
c5c0: 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   or index named 
c5d0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 2a  as an argument *
c5e0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
c5f0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
c600: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
c610: 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61  Name2, &pTableNa
c620: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
c630: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  >=0 ){.      zDb
c640: 20 3d 20 70 4e 61 6d 65 32 2d 3e 6e 20 3f 20 64   = pName2->n ? d
c650: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
c660: 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 20 20 20 20  Name : 0;.      
c670: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
c680: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
c690: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  bleName);.      
c6a0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
c6b0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
c6c0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
c6d0: 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b  , z, zDb))!=0 ){
c6e0: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
c6f0: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
c700: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49  pIdx->pTable, pI
c710: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  dx);.        }el
c720: 73 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73  se if( (pTab = s
c730: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
c740: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20  e(pParse, 0, z, 
c750: 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  zDb))!=0 ){.    
c760: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
c770: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
c780: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
c790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c7a0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
c7b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
c7c0: 20 69 66 28 20 64 62 2d 3e 6e 53 71 6c 45 78 65   if( db->nSqlExe
c7d0: 63 3d 3d 30 20 26 26 20 28 76 20 3d 20 73 71 6c  c==0 && (v = sql
c7e0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c7f0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  se))!=0 ){.    s
c800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
c810: 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a  (v, OP_Expire);.
c820: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65    }.}../*.** Use
c830: 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d  d to pass inform
c840: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61  ation from the a
c850: 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72 20 74  nalyzer reader t
c860: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a  hrough to the.**
c870: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
c880: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
c890: 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66  ruct analysisInf
c8a0: 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a  o analysisInfo;.
c8b0: 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49  struct analysisI
c8c0: 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  nfo {.  sqlite3 
c8d0: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
c8e0: 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b  r *zDatabase;.};
c8f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
c900: 74 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74  t argument point
c910: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
c920: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
c930: 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69 73  taining a.** lis
c940: 74 20 6f 66 20 73 70 61 63 65 20 73 65 70 61 72  t of space separ
c950: 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20 52  ated integers. R
c960: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 6e 4f  ead the first nO
c970: 75 74 20 6f 66 20 74 68 65 73 65 20 69 6e 74 6f  ut of these into
c980: 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61 4f  .** the array aO
c990: 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ut[]..*/.static 
c9a0: 76 6f 69 64 20 64 65 63 6f 64 65 49 6e 74 41 72  void decodeIntAr
c9b0: 72 61 79 28 0a 20 20 63 68 61 72 20 2a 7a 49 6e  ray(.  char *zIn
c9c0: 74 41 72 72 61 79 2c 20 20 20 20 20 20 20 2f 2a  tArray,       /*
c9d0: 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   String containi
c9e0: 6e 67 20 69 6e 74 20 61 72 72 61 79 20 74 6f 20  ng int array to 
c9f0: 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  decode */.  int 
ca00: 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nOut,           
ca10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ca20: 73 6c 6f 74 73 20 69 6e 20 61 4f 75 74 5b 5d 20  slots in aOut[] 
ca30: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 4f  */.  tRowcnt *aO
ca40: 75 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ut,         /* S
ca50: 74 6f 72 65 20 69 6e 74 65 67 65 72 73 20 68 65  tore integers he
ca60: 72 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  re */.  LogEst *
ca70: 61 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 2f  aLog,          /
ca80: 2a 20 4f 72 2c 20 69 66 20 61 4f 75 74 3d 3d 30  * Or, if aOut==0
ca90: 2c 20 68 65 72 65 20 2a 2f 0a 20 20 49 6e 64 65  , here */.  Inde
caa0: 78 20 2a 70 49 6e 64 65 78 20 20 20 20 20 20 20  x *pIndex       
cab0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 65 78 74     /* Handle ext
cac0: 72 61 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69  ra flags for thi
cad0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
cae0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  NULL */.){.  cha
caf0: 72 20 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61 79  r *z = zIntArray
cb00: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  ;.  int c;.  int
cb10: 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76 3b   i;.  tRowcnt v;
cb20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cb30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
cb40: 53 54 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d 30  STAT4.  if( z==0
cb50: 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73 65   ) z = "";.#else
cb60: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
cb70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28  );.#endif.  for(
cb80: 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f 75  i=0; *z && i<nOu
cb90: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d  t; i++){.    v =
cba0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
cbb0: 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26 20  c=z[0])>='0' && 
cbc0: 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  c<='9' ){.      
cbd0: 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27  v = v*10 + c - '
cbe0: 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  0';.      z++;. 
cbf0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
cc00: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
cc10: 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28  OR_STAT4.    if(
cc20: 20 61 4f 75 74 20 29 20 61 4f 75 74 5b 69 5d 20   aOut ) aOut[i] 
cc30: 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 61 4c 6f  = v;.    if( aLo
cc40: 67 20 29 20 61 4c 6f 67 5b 69 5d 20 3d 20 73 71  g ) aLog[i] = sq
cc50: 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b 0a  lite3LogEst(v);.
cc60: 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65 72 74  #else.    assert
cc70: 28 20 61 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 20  ( aOut==0 );.   
cc80: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
cc90: 52 28 61 4f 75 74 29 3b 0a 20 20 20 20 61 73 73  R(aOut);.    ass
cca0: 65 72 74 28 20 61 4c 6f 67 21 3d 30 20 29 3b 0a  ert( aLog!=0 );.
ccb0: 20 20 20 20 61 4c 6f 67 5b 69 5d 20 3d 20 73 71      aLog[i] = sq
ccc0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b 0a  lite3LogEst(v);.
ccd0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 2a  #endif.    if( *
cce0: 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  z==' ' ) z++;.  
ccf0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
cd00: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
cd10: 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74 28  _STAT4.  assert(
cd20: 20 70 49 6e 64 65 78 21 3d 30 20 29 3b 20 7b 0a   pIndex!=0 ); {.
cd30: 23 65 6c 73 65 0a 20 20 69 66 28 20 70 49 6e 64  #else.  if( pInd
cd40: 65 78 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  ex ){.#endif.   
cd50: 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
cd60: 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  red = 0;.    pIn
cd70: 64 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20  dex->noSkipScan 
cd80: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
cd90: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 66  z[0] ){.      if
cda0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
cdb0: 62 28 22 75 6e 6f 72 64 65 72 65 64 2a 22 2c 20  b("unordered*", 
cdc0: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
cdd0: 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
cde0: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  red = 1;.      }
cdf0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
ce00: 5f 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30 2d  _strglob("sz=[0-
ce10: 39 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  9]*", z)==0 ){. 
ce20: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 73         pIndex->s
ce30: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
ce40: 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65 33 41  3LogEst(sqlite3A
ce50: 74 6f 69 28 7a 2b 33 29 29 3b 0a 20 20 20 20 20  toi(z+3));.     
ce60: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
ce70: 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 73 6b  e3_strglob("nosk
ce80: 69 70 73 63 61 6e 2a 22 2c 20 7a 29 3d 3d 30 20  ipscan*", z)==0 
ce90: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
cea0: 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20  x->noSkipScan = 
ceb0: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  1;.      }.#ifde
cec0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ced0: 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 20 20 65  COSTMULT.      e
cee0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
cef0: 73 74 72 67 6c 6f 62 28 22 63 6f 73 74 6d 75 6c  strglob("costmul
cf00: 74 3d 5b 30 2d 39 5d 2a 22 2c 7a 29 3d 3d 30 20  t=[0-9]*",z)==0 
cf10: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
cf20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d  x->pTable->costM
cf30: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ult = sqlite3Log
cf40: 45 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69 28  Est(sqlite3Atoi(
cf50: 7a 2b 39 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  z+9));.      }.#
cf60: 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 69 6c  endif.      whil
cf70: 65 28 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b  e( z[0]!=0 && z[
cf80: 30 5d 21 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20  0]!=' ' ) z++;. 
cf90: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d       while( z[0]
cfa0: 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  ==' ' ) z++;.   
cfb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
cfc0: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
cfd0: 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
cfe0: 72 20 65 61 63 68 20 69 6e 64 65 78 20 77 68 65  r each index whe
cff0: 6e 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  n reading the.**
d000: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
d010: 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20  ble.  .**.**    
d020: 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20   argv[0] = name 
d030: 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
d040: 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e 61      argv[1] = na
d050: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
d060: 28 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 29 0a  (might be NULL).
d070: 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d  **     argv[2] =
d080: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c   results of anal
d090: 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65  ysis - on intege
d0a0: 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  r for each colum
d0b0: 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20  n.**.** Entries 
d0c0: 66 6f 72 20 77 68 69 63 68 20 61 72 67 76 5b 31  for which argv[1
d0d0: 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ]==NULL simply r
d0e0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
d0f0: 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20 74   of rows in.** t
d100: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
d110: 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73  tic int analysis
d120: 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61  Loader(void *pDa
d130: 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  ta, int argc, ch
d140: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
d150: 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e  **NotUsed){.  an
d160: 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66  alysisInfo *pInf
d170: 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e 66  o = (analysisInf
d180: 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e 64 65  o*)pData;.  Inde
d190: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61 62  x *pIndex;.  Tab
d1a0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 6f  le *pTable;.  co
d1b0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  nst char *z;..  
d1c0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20  assert( argc==3 
d1d0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
d1e0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
d1f0: 61 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72  argc);..  if( ar
d200: 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d  gv==0 || argv[0]
d210: 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d  ==0 || argv[2]==
d220: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d230: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  0;.  }.  pTable 
d240: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
d250: 6c 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72  le(pInfo->db, ar
d260: 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44  gv[0], pInfo->zD
d270: 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
d280: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
d290: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d2a0: 20 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20   if( argv[1]==0 
d2b0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  ){.    pIndex = 
d2c0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
d2d0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
d2e0: 72 67 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29 3d  rgv[0],argv[1])=
d2f0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  =0 ){.    pIndex
d300: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
d310: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 6c 65  yKeyIndex(pTable
d320: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d330: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
d340: 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d  FindIndex(pInfo-
d350: 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49  >db, argv[1], pI
d360: 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  nfo->zDatabase);
d370: 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b  .  }.  z = argv[
d380: 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  2];..  if( pInde
d390: 78 20 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74  x ){.    tRowcnt
d3a0: 20 2a 61 69 52 6f 77 45 73 74 20 3d 20 30 3b 0a   *aiRowEst = 0;.
d3b0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70      int nCol = p
d3c0: 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31  Index->nKeyCol+1
d3d0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d3e0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
d3f0: 53 54 41 54 34 0a 20 20 20 20 2f 2a 20 49 6e 64  STAT4.    /* Ind
d400: 65 78 2e 61 69 52 6f 77 45 73 74 20 6d 61 79 20  ex.aiRowEst may 
d410: 61 6c 72 65 61 64 79 20 62 65 20 73 65 74 20 68  already be set h
d420: 65 72 65 20 69 66 20 74 68 65 72 65 20 61 72 65  ere if there are
d430: 20 64 75 70 6c 69 63 61 74 65 20 0a 20 20 20 20   duplicate .    
d440: 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  ** sqlite_stat1 
d450: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73  entries for this
d460: 20 69 6e 64 65 78 2e 20 49 6e 20 74 68 61 74 20   index. In that 
d470: 63 61 73 65 20 6a 75 73 74 20 63 6c 6f 62 62 65  case just clobbe
d480: 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64  r.    ** the old
d490: 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e   data with the n
d4a0: 65 77 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c  ew instead of al
d4b0: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 61  locating a new a
d4c0: 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  rray.  */.    if
d4d0: 28 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  ( pIndex->aiRowE
d4e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
d4f0: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
d500: 3d 20 28 74 52 6f 77 63 6e 74 2a 29 73 71 6c 69  = (tRowcnt*)sqli
d510: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
d520: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20  zeof(tRowcnt) * 
d530: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  nCol);.      if(
d540: 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73   pIndex->aiRowEs
d550: 74 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4f 6f  t==0 ) sqlite3Oo
d560: 6d 46 61 75 6c 74 28 70 49 6e 66 6f 2d 3e 64 62  mFault(pInfo->db
d570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 69 52  );.    }.    aiR
d580: 6f 77 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e  owEst = pIndex->
d590: 61 69 52 6f 77 45 73 74 3b 0a 23 65 6e 64 69 66  aiRowEst;.#endif
d5a0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e  .    pIndex->bUn
d5b0: 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  ordered = 0;.   
d5c0: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
d5d0: 28 63 68 61 72 2a 29 7a 2c 20 6e 43 6f 6c 2c 20  (char*)z, nCol, 
d5e0: 61 69 52 6f 77 45 73 74 2c 20 70 49 6e 64 65 78  aiRowEst, pIndex
d5f0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 2c 20 70  ->aiRowLogEst, p
d600: 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 49 6e 64  Index);.    pInd
d610: 65 78 2d 3e 68 61 73 53 74 61 74 31 20 3d 20 31  ex->hasStat1 = 1
d620: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
d630: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
d640: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  =0 ){.      pTab
d650: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
d660: 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f   pIndex->aiRowLo
d670: 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 70  gEst[0];.      p
d680: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
d690: 7c 3d 20 54 46 5f 48 61 73 53 74 61 74 31 3b 0a  |= TF_HasStat1;.
d6a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
d6b0: 20 20 20 49 6e 64 65 78 20 66 61 6b 65 49 64 78     Index fakeIdx
d6c0: 3b 0a 20 20 20 20 66 61 6b 65 49 64 78 2e 73 7a  ;.    fakeIdx.sz
d6d0: 49 64 78 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d  IdxRow = pTable-
d6e0: 3e 73 7a 54 61 62 52 6f 77 3b 0a 23 69 66 64 65  >szTabRow;.#ifde
d6f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d700: 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 66 61 6b  COSTMULT.    fak
d710: 65 49 64 78 2e 70 54 61 62 6c 65 20 3d 20 70 54  eIdx.pTable = pT
d720: 61 62 6c 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  able;.#endif.   
d730: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
d740: 28 63 68 61 72 2a 29 7a 2c 20 31 2c 20 30 2c 20  (char*)z, 1, 0, 
d750: 26 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67  &pTable->nRowLog
d760: 45 73 74 2c 20 26 66 61 6b 65 49 64 78 29 3b 0a  Est, &fakeIdx);.
d770: 20 20 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61      pTable->szTa
d780: 62 52 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e 73  bRow = fakeIdx.s
d790: 7a 49 64 78 52 6f 77 3b 0a 20 20 20 20 70 54 61  zIdxRow;.    pTa
d7a0: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  ble->tabFlags |=
d7b0: 20 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20   TF_HasStat1;.  
d7c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
d7d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ../*.** If the I
d7e0: 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20 76 61 72  ndex.aSample var
d7f0: 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c  iable is not NUL
d800: 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 61 53  L, delete the aS
d810: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 0a 2a 2a  ample[] array.**
d820: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
d830: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
d840: 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
d850: 70 6c 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ples(sqlite3 *db
d860: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
d870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d880: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d890: 41 54 34 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  AT4.  if( pIdx->
d8a0: 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69  aSample ){.    i
d8b0: 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
d8c0: 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; j<pIdx->nSamp
d8d0: 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  le; j++){.      
d8e0: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 20 3d  IndexSample *p =
d8f0: 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b   &pIdx->aSample[
d900: 6a 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  j];.      sqlite
d910: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
d920: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
d930: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d940: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20  Idx->aSample);. 
d950: 20 7d 0a 20 20 69 66 28 20 64 62 20 26 26 20 64   }.  if( db && d
d960: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
d970: 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 2d 3e  =0 ){.    pIdx->
d980: 6e 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20  nSample = 0;.   
d990: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d   pIdx->aSample =
d9a0: 20 30 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   0;.  }.#else.  
d9b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d9c0: 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
d9d0: 41 52 41 4d 45 54 45 52 28 70 49 64 78 29 3b 0a  ARAMETER(pIdx);.
d9e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d9f0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
da00: 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a 0a 23 69 66  _STAT4 */.}..#if
da10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
da20: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
da30: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
da40: 74 68 65 20 70 49 64 78 2d 3e 61 41 76 67 45 71  the pIdx->aAvgEq
da50: 5b 5d 20 61 72 72 61 79 20 62 61 73 65 64 20 6f  [] array based o
da60: 6e 20 74 68 65 20 73 61 6d 70 6c 65 73 20 63 75  n the samples cu
da70: 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72 65  rrently.** store
da80: 64 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70  d in pIdx->aSamp
da90: 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  le[]. .*/.static
daa0: 20 76 6f 69 64 20 69 6e 69 74 41 76 67 45 71 28   void initAvgEq(
dab0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
dac0: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
dad0: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
dae0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
daf0: 6d 70 6c 65 3b 0a 20 20 20 20 49 6e 64 65 78 53  mple;.    IndexS
db00: 61 6d 70 6c 65 20 2a 70 46 69 6e 61 6c 20 3d 20  ample *pFinal = 
db10: 26 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e  &aSample[pIdx->n
db20: 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 69  Sample-1];.    i
db30: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  nt iCol;.    int
db40: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 69   nCol = 1;.    i
db50: 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  f( pIdx->nSample
db60: 43 6f 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  Col>1 ){.      /
db70: 2a 20 49 66 20 74 68 69 73 20 69 73 20 73 74 61  * If this is sta
db80: 74 34 20 64 61 74 61 2c 20 74 68 65 6e 20 63 61  t4 data, then ca
db90: 6c 63 75 6c 61 74 65 20 61 41 76 67 45 71 5b 5d  lculate aAvgEq[]
dba0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 0a   values for all.
dbb0: 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20        ** sample 
dbc0: 63 6f 6c 75 6d 6e 73 20 65 78 63 65 70 74 20 74  columns except t
dbd0: 68 65 20 6c 61 73 74 2e 20 54 68 65 20 6c 61 73  he last. The las
dbe0: 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
dbf0: 74 6f 20 31 2c 20 61 73 0a 20 20 20 20 20 20 2a  to 1, as.      *
dc00: 2a 20 6f 6e 63 65 20 74 68 65 20 74 72 61 69 6c  * once the trail
dc10: 69 6e 67 20 50 4b 20 66 69 65 6c 64 73 20 61 72  ing PK fields ar
dc20: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6c 6c  e considered all
dc30: 20 69 6e 64 65 78 20 6b 65 79 73 20 61 72 65 0a   index keys are.
dc40: 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 2e        ** unique.
dc50: 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20    */.      nCol 
dc60: 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  = pIdx->nSampleC
dc70: 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 70 49 64 78  ol-1;.      pIdx
dc80: 2d 3e 61 41 76 67 45 71 5b 6e 43 6f 6c 5d 20 3d  ->aAvgEq[nCol] =
dc90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
dca0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 6e  r(iCol=0; iCol<n
dcb0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
dcc0: 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 20      int nSample 
dcd0: 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  = pIdx->nSample;
dce0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
dd10: 61 74 65 20 74 68 72 6f 75 67 68 20 73 61 6d 70  ate through samp
dd20: 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f  les */.      tRo
dd30: 77 63 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b 20  wcnt sumEq = 0; 
dd40: 20 20 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66         /* Sum of
dd50: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
dd60: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
dd70: 20 61 76 67 45 71 20 3d 20 30 3b 0a 20 20 20 20   avgEq = 0;.    
dd80: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dda0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
ddb0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
ddc0: 69 36 34 20 6e 53 75 6d 31 30 30 20 3d 20 30 3b  i64 nSum100 = 0;
ddd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dde0: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63 6f 6e  ber of terms con
ddf0: 74 72 69 62 75 74 69 6e 67 20 74 6f 20 73 75 6d  tributing to sum
de00: 45 71 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  Eq */.      i64 
de10: 6e 44 69 73 74 31 30 30 3b 20 20 20 20 20 20 20  nDist100;       
de20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
de30: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
de40: 65 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  es in index */..
de50: 20 20 20 20 20 20 69 66 28 20 21 70 49 64 78 2d        if( !pIdx-
de60: 3e 61 69 52 6f 77 45 73 74 20 7c 7c 20 69 43 6f  >aiRowEst || iCo
de70: 6c 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  l>=pIdx->nKeyCol
de80: 20 7c 7c 20 70 49 64 78 2d 3e 61 69 52 6f 77 45   || pIdx->aiRowE
de90: 73 74 5b 69 43 6f 6c 2b 31 5d 3d 3d 30 20 29 7b  st[iCol+1]==0 ){
dea0: 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  .        nRow = 
deb0: 70 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69 43 6f  pFinal->anLt[iCo
dec0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e 44 69 73  l];.        nDis
ded0: 74 31 30 30 20 3d 20 28 69 36 34 29 31 30 30 20  t100 = (i64)100 
dee0: 2a 20 70 46 69 6e 61 6c 2d 3e 61 6e 44 4c 74 5b  * pFinal->anDLt[
def0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e  iCol];.        n
df00: 53 61 6d 70 6c 65 2d 2d 3b 0a 20 20 20 20 20 20  Sample--;.      
df10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
df20: 52 6f 77 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f  Row = pIdx->aiRo
df30: 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20  wEst[0];.       
df40: 20 6e 44 69 73 74 31 30 30 20 3d 20 28 28 69 36   nDist100 = ((i6
df50: 34 29 31 30 30 20 2a 20 70 49 64 78 2d 3e 61 69  4)100 * pIdx->ai
df60: 52 6f 77 45 73 74 5b 30 5d 29 20 2f 20 70 49 64  RowEst[0]) / pId
df70: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f 6c  x->aiRowEst[iCol
df80: 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1];.      }.   
df90: 20 20 20 70 49 64 78 2d 3e 6e 52 6f 77 45 73 74     pIdx->nRowEst
dfa0: 30 20 3d 20 6e 52 6f 77 3b 0a 0a 20 20 20 20 20  0 = nRow;..     
dfb0: 20 2f 2a 20 53 65 74 20 6e 53 75 6d 20 74 6f 20   /* Set nSum to 
dfc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69  the number of di
dfd0: 73 74 69 6e 63 74 20 28 69 43 6f 6c 2b 31 29 20  stinct (iCol+1) 
dfe0: 66 69 65 6c 64 20 70 72 65 66 69 78 65 73 20 74  field prefixes t
dff0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  hat.      ** occ
e000: 75 72 20 69 6e 20 74 68 65 20 73 74 61 74 34 20  ur in the stat4 
e010: 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20 69  table for this i
e020: 6e 64 65 78 2e 20 53 65 74 20 73 75 6d 45 71 20  ndex. Set sumEq 
e030: 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 0a 20  to the sum of . 
e040: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 45 71 20       ** the nEq 
e050: 76 61 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75 6d  values for colum
e060: 6e 20 69 43 6f 6c 20 66 6f 72 20 74 68 65 20 73  n iCol for the s
e070: 61 6d 65 20 73 65 74 20 28 61 64 64 69 6e 67 20  ame set (adding 
e080: 74 68 65 20 76 61 6c 75 65 20 0a 20 20 20 20 20  the value .     
e090: 20 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 77 68   ** only once wh
e0a0: 65 72 65 20 74 68 65 72 65 20 65 78 69 73 74 20  ere there exist 
e0b0: 64 75 70 6c 69 63 61 74 65 20 70 72 65 66 69 78  duplicate prefix
e0c0: 65 73 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  es).  */.      f
e0d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c  or(i=0; i<nSampl
e0e0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
e0f0: 20 69 66 28 20 69 3d 3d 28 70 49 64 78 2d 3e 6e   if( i==(pIdx->n
e100: 53 61 6d 70 6c 65 2d 31 29 0a 20 20 20 20 20 20  Sample-1).      
e110: 20 20 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d     || aSample[i]
e120: 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d 61 53  .anDLt[iCol]!=aS
e130: 61 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44 4c 74  ample[i+1].anDLt
e140: 5b 69 43 6f 6c 5d 20 0a 20 20 20 20 20 20 20 20  [iCol] .        
e150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 75 6d  ){.          sum
e160: 45 71 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  Eq += aSample[i]
e170: 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anEq[iCol];.   
e180: 20 20 20 20 20 20 20 6e 53 75 6d 31 30 30 20 2b         nSum100 +
e190: 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d  = 100;.        }
e1a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e1b0: 69 66 28 20 6e 44 69 73 74 31 30 30 3e 6e 53 75  if( nDist100>nSu
e1c0: 6d 31 30 30 20 26 26 20 73 75 6d 45 71 3c 6e 52  m100 && sumEq<nR
e1d0: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 76  ow ){.        av
e1e0: 67 45 71 20 3d 20 28 28 69 36 34 29 31 30 30 20  gEq = ((i64)100 
e1f0: 2a 20 28 6e 52 6f 77 20 2d 20 73 75 6d 45 71 29  * (nRow - sumEq)
e200: 29 2f 28 6e 44 69 73 74 31 30 30 20 2d 20 6e 53  )/(nDist100 - nS
e210: 75 6d 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  um100);.      }.
e220: 20 20 20 20 20 20 69 66 28 20 61 76 67 45 71 3d        if( avgEq=
e230: 3d 30 20 29 20 61 76 67 45 71 20 3d 20 31 3b 0a  =0 ) avgEq = 1;.
e240: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67        pIdx->aAvg
e250: 45 71 5b 69 43 6f 6c 5d 20 3d 20 61 76 67 45 71  Eq[iCol] = avgEq
e260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e270: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20 61 6e 20  *.** Look up an 
e280: 69 6e 64 65 78 20 62 79 20 6e 61 6d 65 2e 20 20  index by name.  
e290: 4f 72 2c 20 69 66 20 74 68 65 20 6e 61 6d 65 20  Or, if the name 
e2a0: 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
e2b0: 49 44 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 73  ID table.** is s
e2c0: 75 70 70 6c 69 65 64 20 69 6e 73 74 65 61 64 2c  upplied instead,
e2d0: 20 66 69 6e 64 20 74 68 65 20 50 52 49 4d 41 52   find the PRIMAR
e2e0: 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
e2f0: 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  that table..*/.s
e300: 74 61 74 69 63 20 49 6e 64 65 78 20 2a 66 69 6e  tatic Index *fin
e310: 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79 4b  dIndexOrPrimaryK
e320: 65 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ey(.  sqlite3 *d
e330: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e340: 2a 7a 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74 20  *zName,.  const 
e350: 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 49  char *zDb.){.  I
e360: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
e370: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
e380: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
e390: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
e3a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e3b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
e3c0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
e3d0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
e3e0: 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54   && !HasRowid(pT
e3f0: 61 62 29 20 29 20 70 49 64 78 20 3d 20 73 71 6c  ab) ) pIdx = sql
e400: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
e410: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20  dex(pTab);.  }. 
e420: 20 72 65 74 75 72 6e 20 70 49 64 78 3b 0a 7d 0a   return pIdx;.}.
e430: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
e440: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69 74  content from eit
e450: 68 65 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73  her the sqlite_s
e460: 74 61 74 34 20 6f 72 20 73 71 6c 69 74 65 5f 73  tat4 or sqlite_s
e470: 74 61 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20 69  tat3 table .** i
e480: 6e 74 6f 20 74 68 65 20 72 65 6c 65 76 61 6e 74  nto the relevant
e490: 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d   Index.aSample[]
e4a0: 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 41   arrays..**.** A
e4b0: 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20 61  rguments zSql1 a
e4c0: 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74 20 70 6f  nd zSql2 must po
e4d0: 69 6e 74 20 74 6f 20 53 51 4c 20 73 74 61 74 65  int to SQL state
e4e0: 6d 65 6e 74 73 20 74 68 61 74 20 72 65 74 75 72  ments that retur
e4f0: 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75 69 76 61  n.** data equiva
e500: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
e510: 6f 77 69 6e 67 20 28 73 74 61 74 65 6d 65 6e 74  owing (statement
e520: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  s are different 
e530: 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73 65  for stat3,.** se
e540: 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  e the caller of 
e550: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f  this function fo
e560: 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a 2a  r details):.**.*
e570: 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c 45  *    zSql1: SELE
e580: 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20  CT idx,count(*) 
e590: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
e5a0: 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69 64  tat4 GROUP BY id
e5b0: 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20 53  x.**    zSql2: S
e5c0: 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c  ELECT idx,neq,nl
e5d0: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52  t,ndlt,sample FR
e5e0: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
e5f0: 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 25  t4.**.** where %
e600: 51 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69  Q is replaced wi
e610: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
e620: 6e 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  name before the 
e630: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
e640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
e650: 6f 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73 71  oadStatTbl(.  sq
e660: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e680: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
e690: 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 33 2c 20  /.  int bStat3, 
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e 67    /* Assume sing
e6c0: 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72 64  le column record
e6d0: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73  s only */.  cons
e6e0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20 20  t char *zSql1,  
e6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
e700: 20 73 74 61 74 65 6d 65 6e 74 20 31 20 28 73 65   statement 1 (se
e710: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f  e above) */.  co
e720: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 2c  nst char *zSql2,
e730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e740: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 32 20 28  QL statement 2 (
e750: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
e760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e780: 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   Database name (
e790: 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a  e.g. "main") */.
e7a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e7d0: 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  es from subrouti
e7e0: 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nes */.  sqlite3
e7f0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
e800: 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c  ;      /* An SQL
e810: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
e820: 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a   run */.  char *
e830: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
e840: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e850: 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
e860: 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ment */.  Index 
e870: 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20 20  *pPrevIdx = 0;  
e880: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
e890: 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ous index in the
e8a0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65 78   loop */.  Index
e8b0: 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b  Sample *pSample;
e8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6c           /* A sl
e8d0: 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d  ot in pIdx->aSam
e8e0: 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ple[] */..  asse
e8f0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
e900: 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
e910: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
e920: 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31 2c  rintf(db, zSql1,
e930: 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53   zDb);.  if( !zS
e940: 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ql ){.    return
e950: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e960: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  PT;.  }.  rc = s
e970: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
e980: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
e990: 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
e9a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
e9b0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  l);.  if( rc ) r
e9c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69  eturn rc;..  whi
e9d0: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
e9e0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
e9f0: 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ROW ){.    int n
ea00: 49 64 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20  IdxCol = 1;     
ea10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ea20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
ea30: 20 73 74 61 74 34 20 72 65 63 6f 72 64 73 20 2a   stat4 records *
ea40: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  /..    char *zIn
ea50: 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  dex;   /* Index 
ea60: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65  name */.    Inde
ea70: 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20 50  x *pIdx;    /* P
ea80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e  ointer to the in
ea90: 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
eaa0: 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20 20    int nSample;  
eab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
eac0: 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e  amples */.    in
ead0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 2f 2a  t nByte;      /*
eae0: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
eaf0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
eb00: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
eb10: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
eb20: 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  e required */.  
eb30: 20 20 74 52 6f 77 63 6e 74 20 2a 70 53 70 61 63    tRowcnt *pSpac
eb40: 65 3b 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d  e;..    zIndex =
eb50: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
eb60: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
eb70: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
eb80: 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74  zIndex==0 ) cont
eb90: 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70 6c  inue;.    nSampl
eba0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
ebb0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
ebc0: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69 6e  ;.    pIdx = fin
ebd0: 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79 4b  dIndexOrPrimaryK
ebe0: 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a  ey(db, zIndex, z
ebf0: 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Db);.    assert(
ec00: 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74 61   pIdx==0 || bSta
ec10: 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d  t3 || pIdx->nSam
ec20: 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  ple==0 );.    /*
ec30: 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20 69   Index.nSample i
ec40: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74 68  s non-zero at th
ec50: 69 73 20 70 6f 69 6e 74 20 69 66 20 64 61 74 61  is point if data
ec60: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
ec70: 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64 20  n.    ** loaded 
ec80: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 34 20 74  from the stat4 t
ec90: 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
eca0: 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20  se ignore stat3 
ecb0: 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69 66  data.  */.    if
ecc0: 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64  ( pIdx==0 || pId
ecd0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f 6e  x->nSample ) con
ece0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62  tinue;.    if( b
ecf0: 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20 20  Stat3==0 ){.    
ed00: 20 20 61 73 73 65 72 74 28 20 21 48 61 73 52 6f    assert( !HasRo
ed10: 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
ed20: 29 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ) || pIdx->nColu
ed30: 6d 6e 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn==pIdx->nKeyCo
ed40: 6c 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  l+1 );.      if(
ed50: 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d   !HasRowid(pIdx-
ed60: 3e 70 54 61 62 6c 65 29 20 26 26 20 49 73 50 72  >pTable) && IsPr
ed70: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
ed80: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  dx) ){.        n
ed90: 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e  IdxCol = pIdx->n
eda0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 65  KeyCol;.      }e
edb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 49 64  lse{.        nId
edc0: 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  xCol = pIdx->nCo
edd0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lumn;.      }.  
ede0: 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53    }.    pIdx->nS
edf0: 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78 43  ampleCol = nIdxC
ee00: 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ol;.    nByte = 
ee10: 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d 70  sizeof(IndexSamp
ee20: 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20  le) * nSample;. 
ee30: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65     nByte += size
ee40: 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 49  of(tRowcnt) * nI
ee50: 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61 6d  dxCol * 3 * nSam
ee60: 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b  ple;.    nByte +
ee70: 3d 20 6e 49 64 78 43 6f 6c 20 2a 20 73 69 7a 65  = nIdxCol * size
ee80: 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20 20 20 20  of(tRowcnt);    
ee90: 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 49 6e   /* Space for In
eea0: 64 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f 0a  dex.aAvgEq[] */.
eeb0: 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70  .    pIdx->aSamp
eec0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
eed0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
eee0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  te);.    if( pId
eef0: 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b  x->aSample==0 ){
ef00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ef10: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ef20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ef30: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
ef40: 20 20 20 20 7d 0a 20 20 20 20 70 53 70 61 63 65      }.    pSpace
ef50: 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 49   = (tRowcnt*)&pI
ef60: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6e 53 61 6d  dx->aSample[nSam
ef70: 70 6c 65 5d 3b 0a 20 20 20 20 70 49 64 78 2d 3e  ple];.    pIdx->
ef80: 61 41 76 67 45 71 20 3d 20 70 53 70 61 63 65 3b  aAvgEq = pSpace;
ef90: 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43   pSpace += nIdxC
efa0: 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ol;.    for(i=0;
efb0: 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29   i<nSample; i++)
efc0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53  {.      pIdx->aS
efd0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d 20  ample[i].anEq = 
efe0: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
eff0: 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20  = nIdxCol;.     
f000: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69   pIdx->aSample[i
f010: 5d 2e 61 6e 4c 74 20 3d 20 70 53 70 61 63 65 3b  ].anLt = pSpace;
f020: 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43   pSpace += nIdxC
f030: 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  ol;.      pIdx->
f040: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74  aSample[i].anDLt
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 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f080: 28 28 75 38 2a 29 70 53 70 61 63 65 29 2d 6e 42  ((u8*)pSpace)-nB
f090: 79 74 65 3d 3d 28 75 38 2a 29 28 70 49 64 78 2d  yte==(u8*)(pIdx-
f0a0: 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a 20 20 7d  >aSample) );.  }
f0b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f0c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
f0d0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
f0e0: 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  rn rc;..  zSql =
f0f0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f100: 64 62 2c 20 7a 53 71 6c 32 2c 20 7a 44 62 29 3b  db, zSql2, zDb);
f110: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
f120: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f130: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f140: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f150: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
f160: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
f170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f180: 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
f190: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
f1a0: 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71  rc;..  while( sq
f1b0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
f1c0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
f1d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
f1e0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f1f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65     /* Index name
f200: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
f210: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
f220: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
f230: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62   to the index ob
f240: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
f250: 6e 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  nCol = 1;       
f260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f270: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f280: 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20  n index */..    
f290: 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a  zIndex = (char *
f2a0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
f2b0: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
f2c0: 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d      if( zIndex==
f2d0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
f2e0: 20 20 70 49 64 78 20 3d 20 66 69 6e 64 49 6e 64    pIdx = findInd
f2f0: 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 64  exOrPrimaryKey(d
f300: 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b  b, zIndex, zDb);
f310: 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
f320: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f330: 20 2f 2a 20 54 68 69 73 20 6e 65 78 74 20 63 6f   /* This next co
f340: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
f350: 69 66 20 64 61 74 61 20 68 61 73 20 61 6c 72 65  if data has alre
f360: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  ady been loaded 
f370: 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65  from .    ** the
f380: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
f390: 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ble. In this cas
f3a0: 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20 64  e ignore stat3 d
f3b0: 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ata.  */.    nCo
f3c0: 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  l = pIdx->nSampl
f3d0: 65 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 62 53  eCol;.    if( bS
f3e0: 74 61 74 33 20 26 26 20 6e 43 6f 6c 3e 31 20 29  tat3 && nCol>1 )
f3f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
f400: 66 28 20 70 49 64 78 21 3d 70 50 72 65 76 49 64  f( pIdx!=pPrevId
f410: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 69 74 41  x ){.      initA
f420: 76 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a  vgEq(pPrevIdx);.
f430: 20 20 20 20 20 20 70 50 72 65 76 49 64 78 20 3d        pPrevIdx =
f440: 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20   pIdx;.    }.   
f450: 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 49 64 78   pSample = &pIdx
f460: 2d 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e  ->aSample[pIdx->
f470: 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64 65  nSample];.    de
f480: 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68  codeIntArray((ch
f490: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
f4a0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29  mn_text(pStmt,1)
f4b0: 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61  ,nCol,pSample->a
f4c0: 6e 45 71 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65  nEq,0,0);.    de
f4d0: 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68  codeIntArray((ch
f4e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
f4f0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
f500: 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61  ,nCol,pSample->a
f510: 6e 4c 74 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65  nLt,0,0);.    de
f520: 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68  codeIntArray((ch
f530: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
f540: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33 29  mn_text(pStmt,3)
f550: 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61  ,nCol,pSample->a
f560: 6e 44 4c 74 2c 30 2c 30 29 3b 0a 0a 20 20 20 20  nDLt,0,0);..    
f570: 2f 2a 20 54 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Take a copy o
f580: 66 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 41 64  f the sample. Ad
f590: 64 20 74 77 6f 20 30 78 30 30 20 62 79 74 65 73  d two 0x00 bytes
f5a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f5b0: 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20 54  buffer..    ** T
f5c0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
f5d0: 68 65 20 73 61 6d 70 6c 65 20 72 65 63 6f 72 64  he sample record
f5e0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 49   is corrupted. I
f5f0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
f600: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
f610: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
f620: 28 29 20 6d 61 79 20 72 65 61 64 20 75 70 20 74  () may read up t
f630: 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61  o two varints pa
f640: 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  st the.    ** en
f650: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  d of the allocat
f660: 65 64 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ed buffer before
f670: 20 69 74 20 72 65 61 6c 69 7a 65 73 20 69 74 20   it realizes it 
f680: 69 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a  is dealing with.
f690: 20 20 20 20 2a 2a 20 61 20 63 6f 72 72 75 70 74      ** a corrupt
f6a0: 20 72 65 63 6f 72 64 2e 20 41 64 64 69 6e 67 20   record. Adding 
f6b0: 74 68 65 20 74 77 6f 20 30 78 30 30 20 62 79 74  the two 0x00 byt
f6c0: 65 73 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  es prevents this
f6d0: 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20 20   from causing.  
f6e0: 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
f6f0: 65 72 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20 20  erread.  */.    
f700: 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71 6c  pSample->n = sql
f710: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
f720: 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20  s(pStmt, 4);.   
f730: 20 70 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73 71   pSample->p = sq
f740: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
f750: 6f 28 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e  o(db, pSample->n
f760: 20 2b 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70   + 2);.    if( p
f770: 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b 0a  Sample->p==0 ){.
f780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
f790: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
f7a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f7b0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f7c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 61     }.    if( pSa
f7d0: 6d 70 6c 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  mple->n ){.     
f7e0: 20 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c 65 2d   memcpy(pSample-
f7f0: 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  >p, sqlite3_colu
f800: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34  mn_blob(pStmt, 4
f810: 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b 0a  ), pSample->n);.
f820: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e      }.    pIdx->
f830: 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a 20  nSample++;.  }. 
f840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
f850: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
f860: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f870: 4f 4b 20 29 20 69 6e 69 74 41 76 67 45 71 28 70  OK ) initAvgEq(p
f880: 50 72 65 76 49 64 78 29 3b 0a 20 20 72 65 74 75  PrevIdx);.  retu
f890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f8a0: 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  Load content fro
f8b0: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
f8c0: 74 34 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  t4 and sqlite_st
f8d0: 61 74 33 20 74 61 62 6c 65 73 20 69 6e 74 6f 20  at3 tables into 
f8e0: 0a 2a 2a 20 74 68 65 20 49 6e 64 65 78 2e 61 53  .** the Index.aS
f8f0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 20 6f  ample[] arrays o
f900: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  f all indices..*
f910: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61  /.static int loa
f920: 64 53 74 61 74 34 28 73 71 6c 69 74 65 33 20 2a  dStat4(sqlite3 *
f930: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
f940: 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  zDb){.  int rc =
f950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f960: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f970: 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62  t codes from sub
f980: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20 61  routines */..  a
f990: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
f9a0: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
f9b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
f9c0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c  ndTable(db, "sql
f9d0: 69 74 65 5f 73 74 61 74 34 22 2c 20 7a 44 62 29  ite_stat4", zDb)
f9e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61   ){.    rc = loa
f9f0: 64 53 74 61 74 54 62 6c 28 64 62 2c 20 30 2c 0a  dStatTbl(db, 0,.
fa00: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64        "SELECT id
fa10: 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  x,count(*) FROM 
fa20: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20  %Q.sqlite_stat4 
fa30: 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20 0a  GROUP BY idx", .
fa40: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64        "SELECT id
fa50: 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73  x,neq,nlt,ndlt,s
fa60: 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71  ample FROM %Q.sq
fa70: 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a 20 20 20  lite_stat4",.   
fa80: 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20     zDb.    );.  
fa90: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
faa0: 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
fab0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
fac0: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 7a  sqlite_stat3", z
fad0: 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Db) ){.    rc = 
fae0: 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20  loadStatTbl(db, 
faf0: 31 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  1,.      "SELECT
fb00: 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52   idx,count(*) FR
fb10: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
fb20: 74 33 20 47 52 4f 55 50 20 42 59 20 69 64 78 22  t3 GROUP BY idx"
fb30: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
fb40: 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c   idx,neq,nlt,ndl
fb50: 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f 72 64 28  t,sqlite_record(
fb60: 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51 2e  sample) FROM %Q.
fb70: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a 20  sqlite_stat3",. 
fb80: 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a       zDb.    );.
fb90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fba0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fbb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
fbc0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
fbd0: 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f  *.** Load the co
fbe0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c  ntent of the sql
fbf0: 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
fc00: 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62  lite_stat3/4 tab
fc10: 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e 74  les. The.** cont
fc20: 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73  ents of sqlite_s
fc30: 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74 6f  tat1 are used to
fc40: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49 6e   populate the In
fc50: 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a 2a  dex.aiRowEst[].*
fc60: 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63 6f  * arrays. The co
fc70: 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65  ntents of sqlite
fc80: 5f 73 74 61 74 33 2f 34 20 61 72 65 20 75 73 65  _stat3/4 are use
fc90: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  d to populate th
fca0: 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70  e.** Index.aSamp
fcb0: 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a  le[] arrays..**.
fcc0: 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  ** If the sqlite
fcd0: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73 20  _stat1 table is 
fce0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
fcf0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
fd00: 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20  ITE_ERROR.** is 
fd10: 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
fd20: 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66 20  s case, even if 
fd30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
fd40: 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65  AT3/4 was define
fd50: 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d  d .** during com
fd60: 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  pilation and the
fd70: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20   sqlite_stat3/4 
fd80: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
fd90: 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a  , no data is .**
fda0: 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a   read from it..*
fdb0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
fdc0: 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61  NABLE_STAT3/4 wa
fdd0: 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e 67  s defined during
fde0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64   compilation and
fdf0: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f   the .** sqlite_
fe00: 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20 6e  stat4 table is n
fe10: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
fe20: 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
fe30: 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72  TE_ERROR is.** r
fe40: 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65 72  eturned. However
fe50: 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  , in this case, 
fe60: 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f  data is read fro
fe70: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
fe80: 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66 20  t1.** table (if 
fe90: 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20 62  it is present) b
fea0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
feb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
fec0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
fed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
fee0: 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c  ays sets db->mal
fef0: 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68  locFailed..** Th
ff00: 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
ff10: 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
ff20: 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65 72  care about other
ff30: 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65 74   errors, the ret
ff40: 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20  urn.** code may 
ff50: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  be ignored..*/.i
ff60: 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73  nt sqlite3Analys
ff70: 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  isLoad(sqlite3 *
ff80: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
ff90: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e  analysisInfo sIn
ffa0: 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  fo;.  HashElem *
ffb0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  i;.  char *zSql;
ffc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ffd0: 54 45 5f 4f 4b 3b 0a 20 20 53 63 68 65 6d 61 20  TE_OK;.  Schema 
ffe0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
fff0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
10000 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
10010 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
10020 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
10030 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
10040 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  =0 );..  /* Clea
10050 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74  r any prior stat
10060 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73 73 65  istics */.  asse
10070 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10080 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10090 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28  Db, 0) );.  for(
100a0 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
100b0 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
100c0 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
100d0 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
100e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
100f0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
10100 69 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61  i);.    pTab->ta
10110 62 46 6c 61 67 73 20 26 3d 20 7e 54 46 5f 48 61  bFlags &= ~TF_Ha
10120 73 53 74 61 74 31 3b 0a 20 20 7d 0a 20 20 66 6f  sStat1;.  }.  fo
10130 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
10140 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
10150 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  xHash); i; i=sql
10160 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
10170 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10180 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
10190 61 28 69 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  a(i);.    pIdx->
101a0 68 61 73 53 74 61 74 31 20 3d 20 30 3b 0a 23 69  hasStat1 = 0;.#i
101b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
101c0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
101d0 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  4.    sqlite3Del
101e0 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28  eteIndexSamples(
101f0 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70  db, pIdx);.    p
10200 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30  Idx->aSample = 0
10210 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
10220 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74  /* Load new stat
10230 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68  istics out of th
10240 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
10250 61 62 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e  able */.  sInfo.
10260 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f  db = db;.  sInfo
10270 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d  .zDatabase = db-
10280 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
10290 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  me;.  if( sqlite
102a0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
102b0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73  sqlite_stat1", s
102c0 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 21  Info.zDatabase)!
102d0 3d 30 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d  =0 ){.    zSql =
102e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
102f0 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45  db, .        "SE
10300 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61  LECT tbl,idx,sta
10310 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  t FROM %Q.sqlite
10320 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a  _stat1", sInfo.z
10330 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
10340 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
10350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10360 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
10370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
10380 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
10390 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69  b, zSql, analysi
103a0 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c  sLoader, &sInfo,
103b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
103c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
103d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  l);.    }.  }.. 
103e0 20 2f 2a 20 53 65 74 20 61 70 70 72 6f 70 72 69   /* Set appropri
103f0 61 74 65 20 64 65 66 61 75 6c 74 73 20 6f 6e 20  ate defaults on 
10400 61 6c 6c 20 69 6e 64 65 78 65 73 20 6e 6f 74 20  all indexes not 
10410 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  in the sqlite_st
10420 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 61  at1 table */.  a
10430 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
10440 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
10450 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66  , iDb, 0) );.  f
10460 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
10470 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69  irst(&pSchema->i
10480 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  dxHash); i; i=sq
10490 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
104a0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
104b0 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
104c0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 21  ta(i);.    if( !
104d0 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
104e0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
104f0 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20 7d  owEst(pIdx);.  }
10500 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
10510 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20  statistics from 
10520 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
10530 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65   table. */.#ifde
10540 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10550 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
10560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10570 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  OK ){.    db->lo
10580 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
10590 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61  ++;.    rc = loa
105a0 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66 6f  dStat4(db, sInfo
105b0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
105c0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
105d0 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 0a 20  Disable--;.  }. 
105e0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
105f0 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
10600 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d  >idxHash); i; i=
10610 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
10620 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
10630 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
10640 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71 6c  Data(i);.    sql
10650 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 2d 3e  ite3_free(pIdx->
10660 61 69 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 70  aiRowEst);.    p
10670 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  Idx->aiRowEst = 
10680 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
10690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
106a0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
106b0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
106c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
106d0 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
106e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
106f0 4c 59 5a 45 20 2a 2f 0a                          LYZE */.