/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 1250e69bd137314845afec5c489fc49c9de7baef68970b5530a7bc28f7611db1:


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 0a 20 20 22 73 74  */.  0, 0,.  "st
4ba0: 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20 2f 2a  at_init",     /*
4bb0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
4bc0: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
4bd0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f  E_ENABLE_STAT4./
4be0: 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20 70 4f  *.** pNew and pO
4bf0: 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61 6e 64  ld are both cand
4c00: 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69 6f 64  idate non-period
4c10: 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c 65 63  ic samples selec
4c20: 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68 65 20  ted for .** the 
4c30: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70 4e 65  same column (pNe
4c40: 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69  w->iCol==pOld->i
4c50: 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67 20 74  Col). Ignoring t
4c60: 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 0a  his column and .
4c70: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f  ** considering o
4c80: 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  nly any trailing
4c90: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
4ca0: 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76 61 6c   sample hash val
4cb0: 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  ue, this.** func
4cc0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
4cd0: 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e 65 77  e if sample pNew
4ce0: 20 69 73 20 74 6f 20 62 65 20 70 72 65 66 65 72   is to be prefer
4cf0: 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a  red over pOld..*
4d00: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
4d10: 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65 20 74  , if we assume t
4d20: 68 61 74 20 74 68 65 20 63 61 72 64 69 6e 61 6c  hat the cardinal
4d30: 69 74 69 65 73 20 6f 66 20 74 68 65 20 73 65 6c  ities of the sel
4d40: 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ected.** column 
4d50: 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c  for pNew and pOl
4d60: 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69 73 20  d are equal, is 
4d70: 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65 66 65  pNew to be prefe
4d80: 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a  rred over pOld..
4d90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4da0: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
4db0: 20 66 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65   for each argume
4dc0: 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63  nt sample, the c
4dd0: 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  ontents of.** th
4de0: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66  e anEq[] array f
4df0: 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  rom pSample->anE
4e00: 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 2b  q[pSample->iCol+
4e10: 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65 20 76  1] onwards are v
4e20: 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  alid. .*/.static
4e30: 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42 65 74   int sampleIsBet
4e40: 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61 74 34  terPost(.  Stat4
4e50: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20 0a  Accum *pAccum, .
4e60: 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70    Stat4Sample *p
4e70: 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53 61 6d  New, .  Stat4Sam
4e80: 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20 69  ple *pOld.){.  i
4e90: 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63 75 6d  nt nCol = pAccum
4ea0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b  ->nCol;.  int i;
4eb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
4ec0: 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f  >iCol==pOld->iCo
4ed0: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4e 65  l );.  for(i=pNe
4ee0: 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e 43 6f  w->iCol+1; i<nCo
4ef0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
4f00: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3e 70   pNew->anEq[i]>p
4f10: 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72  Old->anEq[i] ) r
4f20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
4f30: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3c 70   pNew->anEq[i]<p
4f40: 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72  Old->anEq[i] ) r
4f50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
4f60: 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68 3e 70  f( pNew->iHash>p
4f70: 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72 65 74  Old->iHash ) ret
4f80: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
4f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
4fa0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4fb0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
4fc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
4fd0: 75 65 20 69 66 20 70 4e 65 77 20 69 73 20 74 6f  ue if pNew is to
4fe0: 20 62 65 20 70 72 65 66 65 72 72 65 64 20 6f 76   be preferred ov
4ff0: 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  er pOld..**.** T
5000: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
5010: 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20 65 61  umes that for ea
5020: 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61 6d 70  ch argument samp
5030: 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  le, the contents
5040: 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71 5b   of.** the anEq[
5050: 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70 53 61  ] array from pSa
5060: 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d 70  mple->anEq[pSamp
5070: 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61 72 64  le->iCol] onward
5080: 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f  s are valid. .*/
5090: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70  .static int samp
50a0: 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20 53 74  leIsBetter(.  St
50b0: 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  at4Accum *pAccum
50c0: 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  , .  Stat4Sample
50d0: 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34   *pNew, .  Stat4
50e0: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a  Sample *pOld.){.
50f0: 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e 65 77    tRowcnt nEqNew
5100: 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e   = pNew->anEq[pN
5110: 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74 52 6f  ew->iCol];.  tRo
5120: 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20 70 4f  wcnt nEqOld = pO
5130: 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d 3e 69  ld->anEq[pOld->i
5140: 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Col];..  assert(
5150: 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65   pOld->isPSample
5160: 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69 73 50  ==0 && pNew->isP
5170: 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 61  Sample==0 );.  a
5180: 73 73 65 72 74 28 20 49 73 53 74 61 74 34 20 7c  ssert( IsStat4 |
5190: 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 30  | (pNew->iCol==0
51a0: 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3d 3d   && pOld->iCol==
51b0: 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28 6e 45  0) );..  if( (nE
51c0: 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29 20 72  qNew>nEqOld) ) r
51d0: 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66 20  eturn 1;.#ifdef 
51e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
51f0: 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e 65 77  AT4.  if( nEqNew
5200: 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20 20 20  ==nEqOld ){.    
5210: 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3c 70  if( pNew->iCol<p
5220: 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65 74 75  Old->iCol ) retu
5230: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
5240: 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f   (pNew->iCol==pO
5250: 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61 6d 70  ld->iCol && samp
5260: 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70  leIsBetterPost(p
5270: 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70 4f 6c  Accum, pNew, pOl
5280: 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  d));.  }.  retur
5290: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  n 0;.#else.  ret
52a0: 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e 45 71  urn (nEqNew==nEq
52b0: 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69 48 61  Old && pNew->iHa
52c0: 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 29 3b  sh>pOld->iHash);
52d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
52e0: 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
52f0: 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a 70 4e  ts of sample *pN
5300: 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 61  ew into the p->a
5310: 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e 65 63  [] array. If nec
5320: 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d 6f 76  essary,.** remov
5330: 65 20 74 68 65 20 6c 65 61 73 74 20 64 65 73 69  e the least desi
5340: 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66 72 6f  rable sample fro
5350: 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61 6b 65  m p->a[] to make
5360: 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   room..*/.static
5370: 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e 73 65   void sampleInse
5380: 72 74 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70  rt(Stat4Accum *p
5390: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
53a0: 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65 72 6f  New, int nEqZero
53b0: 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  ){.  Stat4Sample
53c0: 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20   *pSample = 0;. 
53d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
53e0: 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20 6e 45  t( IsStat4 || nE
53f0: 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23 69 66  qZero==0 );..#if
5400: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5410: 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 74 61  E_STAT4.  /* Sta
5420: 74 34 41 63 63 75 6d 2e 6e 4d 61 78 45 71 5a 65  t4Accum.nMaxEqZe
5430: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ro is set to the
5440: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
5450: 6f 66 20 6c 65 61 64 69 6e 67 20 30 0a 20 20 2a  of leading 0.  *
5460: 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
5470: 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 6f 66 20  anEq[] array of 
5480: 61 6e 79 20 73 61 6d 70 6c 65 20 69 6e 20 53 74  any sample in St
5490: 61 74 34 41 63 63 75 6d 2e 61 5b 5d 2e 20 49 6e  at4Accum.a[]. In
54a0: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  .  ** other word
54b0: 73 2c 20 69 66 20 6e 4d 61 78 45 71 5a 65 72 6f  s, if nMaxEqZero
54c0: 20 69 73 20 6e 2c 20 74 68 65 6e 20 69 74 20 69   is n, then it i
54d0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
54e0: 74 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  t there.  ** are
54f0: 20 6e 6f 20 73 61 6d 70 6c 65 73 20 77 69 74 68   no samples with
5500: 20 53 74 61 74 34 53 61 6d 70 6c 65 2e 61 6e 45   Stat4Sample.anE
5510: 71 5b 6d 5d 3d 3d 30 20 66 6f 72 20 28 6d 3e 3d  q[m]==0 for (m>=
5520: 6e 29 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  n). */.  if( nEq
5530: 5a 65 72 6f 3e 70 2d 3e 6e 4d 61 78 45 71 5a 65  Zero>p->nMaxEqZe
5540: 72 6f 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61  ro ){.    p->nMa
5550: 78 45 71 5a 65 72 6f 20 3d 20 6e 45 71 5a 65 72  xEqZero = nEqZer
5560: 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  o;.  }.  if( pNe
5570: 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20  w->isPSample==0 
5580: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
5590: 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d 20 30  le *pUpgrade = 0
55a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
55b0: 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e 69  ew->anEq[pNew->i
55c0: 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20 20 2f  Col]>0 );..    /
55d0: 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20 69 73  * This sample is
55e0: 20 62 65 69 6e 67 20 61 64 64 65 64 20 62 65 63   being added bec
55f0: 61 75 73 65 20 74 68 65 20 70 72 65 66 69 78 20  ause the prefix 
5600: 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63 6f 6c  that ends in col
5610: 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43 6f 6c  umn .    ** iCol
5620: 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74 69 6d   occurs many tim
5630: 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  es in the table.
5640: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77 65 20   However, if we 
5650: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20  have already.   
5660: 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61 6d 70   ** added a samp
5670: 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20 74  le that shares t
5680: 68 69 73 20 70 72 65 66 69 78 2c 20 74 68 65 72  his prefix, ther
5690: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
56a0: 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  add.    ** this 
56b0: 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20 75 70  one. Instead, up
56c0: 67 72 61 64 65 20 74 68 65 20 70 72 69 6f 72 69  grade the priori
56d0: 74 79 20 6f 66 20 74 68 65 20 68 69 67 68 65 73  ty of the highes
56e0: 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20 20 2a  t priority.    *
56f0: 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d 70 6c  * existing sampl
5700: 65 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  e that shares th
5710: 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f 0a 20  is prefix.  */. 
5720: 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d     for(i=p->nSam
5730: 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ple-1; i>=0; i--
5740: 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53 61  ){.      Stat4Sa
5750: 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26 70 2d  mple *pOld = &p-
5760: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
5770: 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e 65 77   pOld->anEq[pNew
5780: 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20  ->iCol]==0 ){.  
5790: 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
57a0: 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65 74 75  isPSample ) retu
57b0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
57c0: 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3e 70  rt( pOld->iCol>p
57d0: 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 20  New->iCol );.   
57e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61 6d       assert( sam
57f0: 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20 70  pleIsBetter(p, p
5800: 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a 20 20  New, pOld) );.  
5810: 20 20 20 20 20 20 69 66 28 20 70 55 70 67 72 61        if( pUpgra
5820: 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c 65 49  de==0 || sampleI
5830: 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c 64 2c  sBetter(p, pOld,
5840: 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a 20 20   pUpgrade) ){.  
5850: 20 20 20 20 20 20 20 20 70 55 70 67 72 61 64 65          pUpgrade
5860: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 20   = pOld;.       
5870: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5880: 0a 20 20 20 20 69 66 28 20 70 55 70 67 72 61 64  .    if( pUpgrad
5890: 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70 67 72  e ){.      pUpgr
58a0: 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e 65 77  ade->iCol = pNew
58b0: 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 55  ->iCol;.      pU
58c0: 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70 55 70  pgrade->anEq[pUp
58d0: 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d 20 70  grade->iCol] = p
58e0: 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67 72 61  New->anEq[pUpgra
58f0: 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  de->iCol];.     
5900: 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77 5f 6d   goto find_new_m
5910: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  in;.    }.  }.#e
5920: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6e 65  ndif..  /* If ne
5930: 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76 65 20  cessary, remove 
5940: 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f 20 6d  sample iMin to m
5950: 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
5960: 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a 2f 0a   new sample. */.
5970: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
5980: 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b  >=p->mxSample ){
5990: 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65  .    Stat4Sample
59a0: 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b 70   *pMin = &p->a[p
59b0: 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52 6f  ->iMin];.    tRo
59c0: 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d 69  wcnt *anEq = pMi
59d0: 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52 6f  n->anEq;.    tRo
59e0: 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d 69  wcnt *anLt = pMi
59f0: 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74 52 6f  n->anLt;.    tRo
5a00: 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70 4d  wcnt *anDLt = pM
5a10: 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20 73  in->anDLt;.    s
5a20: 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64 62  ampleClear(p->db
5a30: 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d 65 6d  , pMin);.    mem
5a40: 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d 69 6e  move(pMin, &pMin
5a50: 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  [1], sizeof(p->a
5a60: 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70 6c 65  [0])*(p->nSample
5a70: 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a 20 20  -p->iMin-1));.  
5a80: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
5a90: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b  a[p->nSample-1];
5aa0: 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 52  .    pSample->nR
5ab0: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 53  owid = 0;.    pS
5ac0: 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61 6e  ample->anEq = an
5ad0: 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  Eq;.    pSample-
5ae0: 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b 0a  >anDLt = anDLt;.
5af0: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c      pSample->anL
5b00: 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20 70 2d  t = anLt;.    p-
5b10: 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6d 78  >nSample = p->mx
5b20: 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a 0a 20  Sample-1;.  }.. 
5b30: 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20 6c 65   /* The "rows le
5b40: 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74 68 65  ss-than" for the
5b50: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6d 75   rowid column mu
5b60: 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
5b70: 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f 72  an that.  ** for
5b80: 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70 6c 65   the last sample
5b90: 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d 20 61   in the p->a[] a
5ba0: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
5bb0: 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77 6f 75   the samples wou
5bc0: 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74 20 6f  ld.  ** be out o
5bd0: 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69 66 64  f order. */.#ifd
5be0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5bf0: 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74 28  _STAT4.  assert(
5c00: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 0a   p->nSample==0 .
5c10: 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
5c20: 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 20  anLt[p->nCol-1] 
5c30: 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c  > p->a[p->nSampl
5c40: 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f  e-1].anLt[p->nCo
5c50: 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  l-1] );.#endif..
5c60: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
5c70: 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  new sample */.  
5c80: 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b  pSample = &p->a[
5c90: 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 73  p->nSample];.  s
5ca0: 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70 53 61  ampleCopy(p, pSa
5cb0: 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20 20 70  mple, pNew);.  p
5cc0: 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a 20 20  ->nSample++;..  
5cd0: 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72 73  /* Zero the firs
5ce0: 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72 69 65  t nEqZero entrie
5cf0: 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d 20  s in the anEq[] 
5d00: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65 6d 73  array. */.  mems
5d10: 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71  et(pSample->anEq
5d20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77  , 0, sizeof(tRow
5d30: 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b 0a 0a  cnt)*nEqZero);..
5d40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5d50: 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69 6e 64  ABLE_STAT4. find
5d60: 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64 69 66  _new_min:.#endif
5d70: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
5d80: 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  e>=p->mxSample )
5d90: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e 20 3d  {.    int iMin =
5da0: 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
5db0: 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b  ; i<p->mxSample;
5dc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5dd0: 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d 70   p->a[i].isPSamp
5de0: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
5df0: 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30 20       if( iMin<0 
5e00: 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  || sampleIsBette
5e10: 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e 5d  r(p, &p->a[iMin]
5e20: 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a 20  , &p->a[i]) ){. 
5e30: 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b         iMin = i;
5e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5e50: 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e 3e     assert( iMin>
5e60: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d 69  =0 );.    p->iMi
5e70: 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a  n = iMin;.  }.}.
5e80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5e90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
5ea0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
5eb0: 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f 66 20   Field iChng of 
5ec0: 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
5ed0: 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68 61 6e  scanned has chan
5ee0: 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69 73 20  ged. So at this 
5ef0: 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72 72  point.** p->curr
5f00: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ent contains a s
5f10: 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66 6c 65  ample that refle
5f20: 63 74 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  cts the previous
5f30: 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 69   row of the.** i
5f40: 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75 65 20  ndex. The value 
5f50: 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20 61  of anEq[iChng] a
5f60: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 6e  nd subsequent an
5f70: 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61 72  Eq[] elements ar
5f80: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 74 20  e.** correct at 
5f90: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  this point..*/.s
5fa0: 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c  tatic void sampl
5fb0: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 53 74  ePushPrevious(St
5fc0: 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e 74  at4Accum *p, int
5fd0: 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65 66 20   iChng){.#ifdef 
5fe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
5ff0: 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  AT4.  int i;..  
6000: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20  /* Check if any 
6010: 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68 65  samples from the
6020: 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79 20 73   aBest[] array s
6030: 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65 64 0a  hould be pushed.
6040: 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78 53    ** into IndexS
6050: 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68 69  ample.a[] at thi
6060: 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 66  s point.  */.  f
6070: 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32 29  or(i=(p->nCol-2)
6080: 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d 29  ; i>=iChng; i--)
6090: 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c  {.    Stat4Sampl
60a0: 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e 61  e *pBest = &p->a
60b0: 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70 42 65  Best[i];.    pBe
60c0: 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 70 2d  st->anEq[i] = p-
60d0: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d  >current.anEq[i]
60e0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 61  ;.    if( p->nSa
60f0: 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65  mple<p->mxSample
6100: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
6110: 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26 70 2d  er(p, pBest, &p-
6120: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29 7b 0a  >a[p->iMin]) ){.
6130: 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65        sampleInse
6140: 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69 29 3b  rt(p, pBest, i);
6150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6160: 20 43 68 65 63 6b 20 74 68 61 74 20 6e 6f 20 73   Check that no s
6170: 61 6d 70 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  ample contains a
6180: 6e 20 61 6e 45 71 5b 5d 20 65 6e 74 72 79 20 77  n anEq[] entry w
6190: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 66 0a  ith an index of.
61a0: 20 20 2a 2a 20 70 2d 3e 6e 4d 61 78 45 71 5a 65    ** p->nMaxEqZe
61b0: 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20 73 65  ro or greater se
61c0: 74 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  t to zero. */.  
61d0: 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65  for(i=p->nSample
61e0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
61f0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
6200: 6f 72 28 6a 3d 70 2d 3e 6e 4d 61 78 45 71 5a 65  or(j=p->nMaxEqZe
6210: 72 6f 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  ro; j<p->nCol; j
6220: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
6230: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3e 30 20 29 3b  [i].anEq[j]>0 );
6240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
6250: 65 20 74 68 65 20 61 6e 45 71 5b 5d 20 66 69 65  e the anEq[] fie
6260: 6c 64 73 20 6f 66 20 61 6e 79 20 73 61 6d 70 6c  lds of any sampl
6270: 65 73 20 61 6c 72 65 61 64 79 20 63 6f 6c 6c 65  es already colle
6280: 63 74 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 69  cted. */.  if( i
6290: 43 68 6e 67 3c 70 2d 3e 6e 4d 61 78 45 71 5a 65  Chng<p->nMaxEqZe
62a0: 72 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ro ){.    for(i=
62b0: 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e  p->nSample-1; i>
62c0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
62d0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
62e0: 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d 3e 6e  (j=iChng; j<p->n
62f0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
6300: 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 61     if( p->a[i].a
6310: 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d 3e 61  nEq[j]==0 ) p->a
6320: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20 70 2d  [i].anEq[j] = p-
6330: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6a 5d  >current.anEq[j]
6340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6350: 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65 72      p->nMaxEqZer
6360: 6f 20 3d 20 69 43 68 6e 67 3b 0a 20 20 7d 0a 23  o = iChng;.  }.#
6370: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
6380: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6390: 5f 53 54 41 54 33 29 20 26 26 20 21 64 65 66 69  _STAT3) && !defi
63a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
63b0: 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28 20 69  E_STAT4).  if( i
63c0: 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 74  Chng==0 ){.    t
63d0: 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e  Rowcnt nLt = p->
63e0: 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30 5d 3b  current.anLt[0];
63f0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71  .    tRowcnt nEq
6400: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
6410: 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43  Eq[0];..    /* C
6420: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
6430: 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63  to be a periodic
6440: 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20   sample. If so, 
6450: 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  add it. */.    i
6460: 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d  f( (nLt/p->nPSam
6470: 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71 29 2f  ple)!=(nLt+nEq)/
6480: 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20  p->nPSample ){. 
6490: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
64a0: 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20  isPSample = 1;. 
64b0: 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72       sampleInser
64c0: 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74  t(p, &p->current
64d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63  , 0);.      p->c
64e0: 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65  urrent.isPSample
64f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
6500: 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66 20 69  ..    /* Or if i
6510: 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72 69 6f  t is a non-perio
6520: 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64 64 20  dic sample. Add 
6530: 69 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  it in this case 
6540: 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  too. */.    if( 
6550: 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78  p->nSample<p->mx
6560: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c 7c 20  Sample .     || 
6570: 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70  sampleIsBetter(p
6580: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26  , &p->current, &
6590: 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 0a  p->a[p->iMin]) .
65a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 61 6d      ){.      sam
65b0: 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d  pleInsert(p, &p-
65c0: 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20  >current, 0);.  
65d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
65e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
65f0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
6600: 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f 50 41  TAT4.  UNUSED_PA
6610: 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a 20 20  RAMETER( p );.  
6620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6630: 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e 64 69  ( iChng );.#endi
6640: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  f.}../*.** Imple
6650: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6660: 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c 20 66   stat_push SQL f
6670: 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74 5f 70  unction:  stat_p
6680: 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20 41 72  ush(P,C,R).** Ar
6690: 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  guments:.**.**  
66a0: 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65 72 20    P     Pointer 
66b0: 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63 75  to the Stat4Accu
66c0: 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74 65 64  m object created
66d0: 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28 29 0a   by stat_init().
66e0: 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e 64 65  **    C     Inde
66f0: 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  x of left-most c
6700: 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65 72 20  olumn to differ 
6710: 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 72 6f  from previous ro
6720: 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20 52 6f  w.**    R     Ro
6730: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
6740: 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68 74 20  ent row.  Might 
6750: 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72 64 20  be a key record 
6760: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
6770: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
6780: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
6790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 6c   SQL function al
67a0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55 4c  ways returns NUL
67b0: 4c 2e 20 20 49 74 27 73 20 70 75 72 70 6f 73 65  L.  It's purpose
67c0: 20 69 74 20 74 6f 20 61 63 63 75 6d 75 6c 61 74   it to accumulat
67d0: 65 0a 2a 2a 20 73 74 61 74 69 73 74 69 63 61 6c  e.** statistical
67e0: 20 64 61 74 61 20 61 6e 64 2f 6f 72 20 73 61 6d   data and/or sam
67f0: 70 6c 65 73 20 69 6e 20 74 68 65 20 53 74 61 74  ples in the Stat
6800: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 61 62  4Accum object ab
6810: 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  out the.** index
6820: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e   being analyzed.
6830: 20 20 54 68 65 20 73 74 61 74 5f 67 65 74 28 29    The stat_get()
6840: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 69   SQL function wi
6850: 6c 6c 20 6c 61 74 65 72 20 62 65 20 75 73 65 64  ll later be used
6860: 20 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74 20 72   to.** extract r
6870: 65 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d 61 74  elevant informat
6880: 69 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72 75 63  ion for construc
6890: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ting the sqlite_
68a0: 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a 2a  statN tables..**
68b0: 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61 6d 65  .** The R parame
68c0: 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ter is only used
68d0: 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53   for STAT3 and S
68e0: 54 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63 20 76  TAT4.*/.static v
68f0: 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a 20 20  oid statPush(.  
6900: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6910: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
6920: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
6930: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6940: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54    int i;..  /* T
6950: 68 65 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  he three functio
6960: 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
6970: 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d   Stat4Accum *p =
6980: 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71   (Stat4Accum*)sq
6990: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
69a0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
69b0: 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74 65 33   iChng = sqlite3
69c0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
69d0: 31 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  1]);..  UNUSED_P
69e0: 41 52 41 4d 45 54 45 52 28 20 61 72 67 63 20 29  ARAMETER( argc )
69f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6a00: 45 54 45 52 28 20 63 6f 6e 74 65 78 74 20 29 3b  ETER( context );
6a10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 43  .  assert( p->nC
6a20: 6f 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ol>0 );.  assert
6a30: 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f 6c 20  ( iChng<p->nCol 
6a40: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f  );..  if( p->nRo
6a50: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  w==0 ){.    /* T
6a60: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
6a70: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
6a80: 6e 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69 74 69  nction. Do initi
6a90: 61 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  alization. */.  
6aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6ab0: 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e 63 75  nCol; i++) p->cu
6ac0: 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20  rrent.anEq[i] = 
6ad0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
6ae0: 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20 73 75  /* Second and su
6af0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 67  bsequent calls g
6b00: 65 74 20 70 72 6f 63 65 73 73 65 64 20 68 65 72  et processed her
6b10: 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c 65 50  e */.    sampleP
6b20: 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c 20 69  ushPrevious(p, i
6b30: 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  Chng);..    /* U
6b40: 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c 20 61  pdate anDLt[], a
6b50: 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71 5b 5d  nLt[] and anEq[]
6b60: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
6b70: 76 61 6c 75 65 73 20 74 68 61 74 20 61 70 70 6c  values that appl
6b80: 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  y.    ** to the 
6b90: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
6ba0: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  he index. */.   
6bb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43 68 6e   for(i=0; i<iChn
6bc0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  g; i++){.      p
6bd0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
6be0: 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ]++;.    }.    f
6bf0: 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c 70 2d  or(i=iChng; i<p-
6c00: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6c10: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
6c20: 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64 65 66  DLt[i]++;.#ifdef
6c30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6c40: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
6c50: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61      p->current.a
6c60: 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63 75 72  nLt[i] += p->cur
6c70: 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a 23 65  rent.anEq[i];.#e
6c80: 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 63 75  ndif.      p->cu
6c90: 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20  rrent.anEq[i] = 
6ca0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
6cb0: 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64 65 66  ->nRow++;.#ifdef
6cc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6cd0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
6ce0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
6cf0: 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d  e_type(argv[2])=
6d00: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
6d10: 29 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53 65 74  ){.    sampleSet
6d20: 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e 64 62  RowidInt64(p->db
6d30: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73  , &p->current, s
6d40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6d50: 36 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20  64(argv[2]));.  
6d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c  }else{.    sampl
6d70: 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64 62 2c  eSetRowid(p->db,
6d80: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73 71   &p->current, sq
6d90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6da0: 73 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20 20  s(argv[2]),.    
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
6de0: 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29 29 3b  _blob(argv[2]));
6df0: 0a 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72 65 6e  .  }.  p->curren
6e00: 74 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69 50 72  t.iHash = p->iPr
6e10: 6e 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30 33  n = p->iPrn*1103
6e20: 35 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a  515245 + 12345;.
6e30: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
6e40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
6e50: 54 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f 77 63  T4.  {.    tRowc
6e60: 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72 72  nt nLt = p->curr
6e70: 65 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c  ent.anLt[p->nCol
6e80: 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  -1];..    /* Che
6e90: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 6f  ck if this is to
6ea0: 20 62 65 20 61 20 70 65 72 69 6f 64 69 63 20 73   be a periodic s
6eb0: 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64  ample. If so, ad
6ec0: 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d it. */.    if(
6ed0: 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c   (nLt/p->nPSampl
6ee0: 65 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d 3e 6e  e)!=(nLt+1)/p->n
6ef0: 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  PSample ){.     
6f00: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53   p->current.isPS
6f10: 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  ample = 1;.     
6f20: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c   p->current.iCol
6f30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 61 6d 70   = 0;.      samp
6f40: 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e  leInsert(p, &p->
6f50: 63 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43 6f 6c  current, p->nCol
6f60: 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75  -1);.      p->cu
6f70: 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20  rrent.isPSample 
6f80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
6f90: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 42  /* Update the aB
6fa0: 65 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a  est[] array. */.
6fb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
6fc0: 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29  p->nCol-1); i++)
6fd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65  {.      p->curre
6fe0: 6e 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20  nt.iCol = i;.   
6ff0: 20 20 20 69 66 28 20 69 3e 3d 69 43 68 6e 67 20     if( i>=iChng 
7000: 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  || sampleIsBette
7010: 72 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63 75 72  rPost(p, &p->cur
7020: 72 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73 74 5b  rent, &p->aBest[
7030: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  i]) ){.        s
7040: 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26 70 2d  ampleCopy(p, &p-
7050: 3e 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d 3e 63  >aBest[i], &p->c
7060: 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d  urrent);.      }
7070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7080: 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  f.}.static const
7090: 20 46 75 6e 63 44 65 66 20 73 74 61 74 50 75 73   FuncDef statPus
70a0: 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32  hFuncdef = {.  2
70b0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
70c0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
70d0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
70e0: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
70f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7100: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
7110: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
7120: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
7130: 20 20 73 74 61 74 50 75 73 68 2c 20 20 20 20 20    statPush,     
7140: 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a     /* xSFunc */.
7150: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7160: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
7170: 2a 2f 0a 20 20 30 2c 20 30 2c 0a 20 20 22 73 74  */.  0, 0,.  "st
7180: 61 74 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a  at_push",     /*
7190: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
71a0: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 54 41 54  };..#define STAT
71b0: 5f 47 45 54 5f 53 54 41 54 31 20 30 20 20 20 20  _GET_STAT1 0    
71c0: 20 20 20 20 20 20 2f 2a 20 22 73 74 61 74 22 20        /* "stat" 
71d0: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 31 20  column of stat1 
71e0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
71f0: 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20   STAT_GET_ROWID 
7200: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 72  1          /* "r
7210: 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  owid" column of 
7220: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
7230: 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47  /.#define STAT_G
7240: 45 54 5f 4e 45 51 20 20 20 32 20 20 20 20 20 20  ET_NEQ   2      
7250: 20 20 20 20 2f 2a 20 22 6e 65 71 22 20 63 6f 6c      /* "neq" col
7260: 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20  umn of stat[34] 
7270: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7280: 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 20 20 20   STAT_GET_NLT   
7290: 33 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 6e  3          /* "n
72a0: 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  lt" column of st
72b0: 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a  at[34] entry */.
72c0: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
72d0: 5f 4e 44 4c 54 20 20 34 20 20 20 20 20 20 20 20  _NDLT  4        
72e0: 20 20 2f 2a 20 22 6e 64 6c 74 22 20 63 6f 6c 75    /* "ndlt" colu
72f0: 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65  mn of stat[34] e
7300: 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ntry */../*.** I
7310: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7320: 20 74 68 65 20 73 74 61 74 5f 67 65 74 28 50 2c   the stat_get(P,
7330: 4a 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  J) SQL function.
7340: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
7350: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 71 75 65  s.** used to que
7360: 72 79 20 73 74 61 74 69 73 74 69 63 61 6c 20 69  ry statistical i
7370: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
7380: 68 61 73 20 62 65 65 6e 20 67 61 74 68 65 72 65  has been gathere
7390: 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 74  d into.** the St
73a0: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
73b0: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
73c0: 6f 20 73 74 61 74 5f 70 75 73 68 28 29 2e 20 20  o stat_push().  
73d0: 54 68 65 20 50 20 70 61 72 61 6d 65 74 65 72 0a  The P parameter.
73e0: 2a 2a 20 68 61 73 20 74 79 70 65 20 42 4c 4f 42  ** has type BLOB
73f0: 20 62 75 74 20 69 74 20 69 73 20 72 65 61 6c 6c   but it is reall
7400: 79 20 6a 75 73 74 20 61 20 70 6f 69 6e 74 65 72  y just a pointer
7410: 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63   to the Stat4Acc
7420: 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68  um object..** Th
7430: 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 72 65 74  e content to ret
7440: 75 72 6e 65 64 20 69 73 20 64 65 74 65 72 6d 69  urned is determi
7450: 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ned by the param
7460: 65 74 65 72 20 4a 0a 2a 2a 20 77 68 69 63 68 20  eter J.** which 
7470: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 54  is one of the ST
7480: 41 54 5f 47 45 54 5f 78 78 78 78 20 76 61 6c 75  AT_GET_xxxx valu
7490: 65 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  es defined above
74a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74  ..**.** The stat
74b0: 5f 67 65 74 28 50 2c 4a 29 20 66 75 6e 63 74 69  _get(P,J) functi
74c0: 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  on is not availa
74d0: 62 6c 65 20 74 6f 20 67 65 6e 65 72 69 63 20 53  ble to generic S
74e0: 51 4c 2e 20 20 49 74 20 69 73 0a 2a 2a 20 69 6e  QL.  It is.** in
74f0: 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f  serted as part o
7500: 66 20 61 20 6d 61 6e 75 61 6c 6c 79 20 63 6f 6e  f a manually con
7510: 73 74 72 75 63 74 65 64 20 62 79 74 65 63 6f 64  structed bytecod
7520: 65 20 70 72 6f 67 72 61 6d 2e 20 20 28 53 65 65  e program.  (See
7530: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 53 74 61 74  .** the callStat
7540: 47 65 74 28 29 20 72 6f 75 74 69 6e 65 20 62 65  Get() routine be
7550: 6c 6f 77 2e 29 20 20 49 74 20 69 73 20 67 75 61  low.)  It is gua
7560: 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
7570: 20 50 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20   P.** parameter 
7580: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
7590: 20 70 6f 69 6e 65 72 20 74 6f 20 61 20 53 74 61   poiner to a Sta
75a0: 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2c 20  t4Accum object, 
75b0: 6e 65 76 65 72 20 61 0a 2a 2a 20 4e 55 4c 4c 2e  never a.** NULL.
75c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
75d0: 72 20 53 54 41 54 33 20 6e 6f 72 20 53 54 41 54  r STAT3 nor STAT
75e0: 34 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74  4 are enabled, t
75f0: 68 65 6e 20 4a 20 69 73 20 61 6c 77 61 79 73 0a  hen J is always.
7600: 2a 2a 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  ** STAT_GET_STAT
7610: 31 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 6f  1 and is hence o
7620: 6d 69 74 74 65 64 20 61 6e 64 20 74 68 69 73 20  mitted and this 
7630: 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a  routine becomes.
7640: 2a 2a 20 61 20 6f 6e 65 2d 70 61 72 61 6d 65 74  ** a one-paramet
7650: 65 72 20 66 75 6e 63 74 69 6f 6e 2c 20 73 74 61  er function, sta
7660: 74 5f 67 65 74 28 50 29 2c 20 74 68 61 74 20 61  t_get(P), that a
7670: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 74 68  lways returns th
7680: 65 0a 2a 2a 20 73 74 61 74 31 20 74 61 62 6c 65  e.** stat1 table
7690: 20 65 6e 74 72 79 20 69 6e 66 6f 72 6d 61 74 69   entry informati
76a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
76b0: 69 64 20 73 74 61 74 47 65 74 28 0a 20 20 73 71  id statGet(.  sq
76c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
76d0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
76e0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
76f0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7700: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20  Stat4Accum *p = 
7710: 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c  (Stat4Accum*)sql
7720: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
7730: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 64 65 66  argv[0]);.#ifdef
7740: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7750: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
7760: 2f 2a 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  /* STAT3 and STA
7770: 54 34 20 68 61 76 65 20 61 20 70 61 72 61 6d 65  T4 have a parame
7780: 74 65 72 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ter on this rout
7790: 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 43  ine. */.  int eC
77a0: 61 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  all = sqlite3_va
77b0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
77c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
77d0: 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
77e0: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
77f0: 5f 53 54 41 54 31 20 7c 7c 20 65 43 61 6c 6c 3d  _STAT1 || eCall=
7800: 3d 53 54 41 54 5f 47 45 54 5f 4e 45 51 20 0a 20  =STAT_GET_NEQ . 
7810: 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d        || eCall==
7820: 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20 7c  STAT_GET_ROWID |
7830: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
7840: 54 5f 4e 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20  T_NLT.       || 
7850: 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f  eCall==STAT_GET_
7860: 4e 44 4c 54 20 0a 20 20 29 3b 0a 20 20 69 66 28  NDLT .  );.  if(
7870: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7880: 5f 53 54 41 54 31 20 29 0a 23 65 6c 73 65 0a 20  _STAT1 ).#else. 
7890: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
78a0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20   );.#endif.  {. 
78b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
78c0: 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20   value to store 
78d0: 69 6e 20 74 68 65 20 22 73 74 61 74 22 20 63 6f  in the "stat" co
78e0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  lumn of the sqli
78f0: 74 65 5f 73 74 61 74 31 0a 20 20 20 20 2a 2a 20  te_stat1.    ** 
7900: 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20 69  table for this i
7910: 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
7920: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
7930: 20 61 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73   a string compos
7940: 65 64 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20  ed of a list of 
7950: 69 6e 74 65 67 65 72 73 20 64 65 73 63 72 69 62  integers describ
7960: 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ing .    ** the 
7970: 69 6e 64 65 78 2e 20 54 68 65 20 66 69 72 73 74  index. The first
7980: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
7990: 6c 69 73 74 20 69 73 20 74 68 65 20 74 6f 74 61  list is the tota
79a0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  l number of .   
79b0: 20 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74   ** entries in t
79c0: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 72 65 20  he index. There 
79d0: 69 73 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  is one additiona
79e0: 6c 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  l integer in the
79f0: 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a 20 66 6f   list .    ** fo
7a00: 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 63  r each indexed c
7a10: 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 61 64 64 69  olumn. This addi
7a20: 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69  tional integer i
7a30: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
7a40: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
7a50: 65 72 20 6f 66 20 72 6f 77 73 20 6d 61 74 63 68  er of rows match
7a60: 65 64 20 62 79 20 61 20 73 74 61 62 62 69 6e 67  ed by a stabbing
7a70: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 20 69 6e   query on the in
7a80: 64 65 78 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  dex using.    **
7a90: 20 61 20 6b 65 79 20 77 69 74 68 20 74 68 65 20   a key with the 
7aa0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 75  corresponding nu
7ab0: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
7ac0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
7ad0: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 69 6e      ** if the in
7ae0: 64 65 78 20 69 73 20 6f 6e 20 63 6f 6c 75 6d 6e  dex is on column
7af0: 73 20 28 61 2c 62 29 20 61 6e 64 20 74 68 65 20  s (a,b) and the 
7b00: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 76 61 6c  sqlite_stat1 val
7b10: 75 65 20 69 73 20 0a 20 20 20 20 2a 2a 20 22 31  ue is .    ** "1
7b20: 30 30 20 31 30 20 32 22 2c 20 74 68 65 6e 20 53  00 10 2", then S
7b30: 51 4c 69 74 65 20 65 73 74 69 6d 61 74 65 73 20  QLite estimates 
7b40: 74 68 61 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  that:.    **.   
7b50: 20 2a 2a 20 20 20 2a 20 74 68 65 20 69 6e 64 65   **   * the inde
7b60: 78 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 72  x contains 100 r
7b70: 6f 77 73 2c 0a 20 20 20 20 2a 2a 20 20 20 2a 20  ows,.    **   * 
7b80: 22 57 48 45 52 45 20 61 3d 3f 22 20 6d 61 74 63  "WHERE a=?" matc
7b90: 68 65 73 20 31 30 20 72 6f 77 73 2c 20 61 6e 64  hes 10 rows, and
7ba0: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48 45  .    **   * "WHE
7bb0: 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 22 20  RE a=? AND b=?" 
7bc0: 6d 61 74 63 68 65 73 20 32 20 72 6f 77 73 2e 0a  matches 2 rows..
7bd0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
7be0: 20 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20   D is the count 
7bf0: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
7c00: 65 73 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20  es and K is the 
7c10: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c20: 0a 20 20 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  .    ** rows, th
7c30: 65 6e 20 65 61 63 68 20 65 73 74 69 6d 61 74 65  en each estimate
7c40: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 73 3a   is computed as:
7c50: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
7c60: 20 20 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31        I = (K+D-1
7c70: 29 2f 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )/D.    */.    c
7c80: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
7c90: 69 3b 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  i;..    char *zR
7ca0: 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  et = sqlite3Mall
7cb0: 6f 63 5a 65 72 6f 28 20 28 70 2d 3e 6e 4b 65 79  ocZero( (p->nKey
7cc0: 43 6f 6c 2b 31 29 2a 32 35 20 29 3b 0a 20 20 20  Col+1)*25 );.   
7cd0: 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a   if( zRet==0 ){.
7ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7cf0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
7d00: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
7d10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
7d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d30: 69 6e 74 66 28 32 34 2c 20 7a 52 65 74 2c 20 22  intf(24, zRet, "
7d40: 25 6c 6c 75 22 2c 20 28 75 36 34 29 70 2d 3e 6e  %llu", (u64)p->n
7d50: 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52  Row);.    z = zR
7d60: 65 74 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  et + sqlite3Strl
7d70: 65 6e 33 30 28 7a 52 65 74 29 3b 0a 20 20 20 20  en30(zRet);.    
7d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4b  for(i=0; i<p->nK
7d90: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
7da0: 20 20 20 75 36 34 20 6e 44 69 73 74 69 6e 63 74     u64 nDistinct
7db0: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
7dc0: 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20  DLt[i] + 1;.    
7dd0: 20 20 75 36 34 20 69 56 61 6c 20 3d 20 28 70 2d    u64 iVal = (p-
7de0: 3e 6e 52 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63  >nRow + nDistinc
7df0: 74 20 2d 20 31 29 20 2f 20 6e 44 69 73 74 69 6e  t - 1) / nDistin
7e00: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
7e10: 33 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a  3_snprintf(24, z
7e20: 2c 20 22 20 25 6c 6c 75 22 2c 20 69 56 61 6c 29  , " %llu", iVal)
7e30: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
7e40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
7e50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7e60: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
7e70: 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ] );.    }.    a
7e80: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30  ssert( z[0]=='\0
7e90: 27 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a  ' && z>zRet );..
7ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7eb0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
7ec0: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
7ed0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69  e3_free);.  }.#i
7ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7ef0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
7f00: 34 0a 20 20 65 6c 73 65 20 69 66 28 20 65 43 61  4.  else if( eCa
7f10: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7f20: 49 44 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ID ){.    if( p-
7f30: 3e 69 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  >iGet<0 ){.     
7f40: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
7f50: 6f 75 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  ous(p, 0);.     
7f60: 20 70 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20   p->iGet = 0;.  
7f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
7f80: 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29  Get<p->nSample )
7f90: 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53 61 6d  {.      Stat4Sam
7fa0: 70 6c 65 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b  ple *pS = p->a +
7fb0: 20 70 2d 3e 69 47 65 74 3b 0a 20 20 20 20 20 20   p->iGet;.      
7fc0: 69 66 28 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d  if( pS->nRowid==
7fd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
7fe0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
7ff0: 34 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75  4(context, pS->u
8000: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
8010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8020: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
8030: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e  ob(context, pS->
8040: 75 2e 61 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52  u.aRowid, pS->nR
8050: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
8080: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
8090: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
80a0: 74 52 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20  tRowcnt *aCnt = 
80b0: 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  0;..    assert( 
80c0: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
80d0: 6c 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  le );.    switch
80e0: 28 20 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20  ( eCall ){.     
80f0: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
8100: 45 51 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  EQ:  aCnt = p->a
8110: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20  [p->iGet].anEq; 
8120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8130: 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20  e STAT_GET_NLT: 
8140: 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e   aCnt = p->a[p->
8150: 69 47 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61  iGet].anLt; brea
8160: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
8170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74  : {.        aCnt
8180: 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d   = p->a[p->iGet]
8190: 2e 61 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20  .anDLt; .       
81a0: 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20   p->iGet++;.    
81b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
81c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
81d0: 28 20 49 73 53 74 61 74 33 20 29 7b 0a 20 20 20  ( IsStat3 ){.   
81e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
81f0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
8200: 20 28 69 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a   (i64)aCnt[0]);.
8210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8220: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
8230: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
8240: 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20  p->nCol * 25);. 
8250: 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30       if( zRet==0
8260: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8270: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8280: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
82a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
82b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a       char *z = z
82c0: 52 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Ret;.        for
82d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
82e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
82f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8300: 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c 75 20 22  f(24, z, "%llu "
8310: 2c 20 28 75 36 34 29 61 43 6e 74 5b 69 5d 29 3b  , (u64)aCnt[i]);
8320: 0a 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  .          z += 
8330: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8340: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
8350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
8360: 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52  0]=='\0' && z>zR
8370: 65 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b  et );.        z[
8380: 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
8390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
83a0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
83b0: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
83c0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
83d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
83e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
83f0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
8400: 54 34 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  T4 */.#ifndef SQ
8410: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
8420: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61  SED_PARAMETER( a
8430: 72 67 63 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rgc );.#endif.}.
8440: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
8450: 63 44 65 66 20 73 74 61 74 47 65 74 46 75 6e 63  cDef statGetFunc
8460: 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49 73 53 74  def = {.  1+IsSt
8470: 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41  at34,      /* nA
8480: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
8490: 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63  TF8,     /* func
84a0: 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  Flags */.  0,   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
84c0: 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c  UserData */.  0,
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84e0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61  * pNext */.  sta
84f0: 74 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  tGet,         /*
8500: 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20   xSFunc */.  0, 
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8520: 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20   xFinalize */.  
8530: 30 2c 20 30 2c 0a 20 20 22 73 74 61 74 5f 67 65  0, 0,.  "stat_ge
8540: 74 22 2c 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d  t",      /* zNam
8550: 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 73  e */.  {0}.};..s
8560: 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 53  tatic void callS
8570: 74 61 74 47 65 74 28 56 64 62 65 20 2a 76 2c 20  tatGet(Vdbe *v, 
8580: 69 6e 74 20 72 65 67 53 74 61 74 34 2c 20 69 6e  int regStat4, in
8590: 74 20 69 50 61 72 61 6d 2c 20 69 6e 74 20 72 65  t iParam, int re
85a0: 67 4f 75 74 29 7b 0a 20 20 61 73 73 65 72 74 28  gOut){.  assert(
85b0: 20 72 65 67 4f 75 74 21 3d 72 65 67 53 74 61 74   regOut!=regStat
85c0: 34 20 26 26 20 72 65 67 4f 75 74 21 3d 72 65 67  4 && regOut!=reg
85d0: 53 74 61 74 34 2b 31 20 29 3b 0a 23 69 66 64 65  Stat4+1 );.#ifde
85e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
85f0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
8600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8610: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8620: 2c 20 69 50 61 72 61 6d 2c 20 72 65 67 53 74 61  , iParam, regSta
8630: 74 34 2b 31 29 3b 0a 23 65 6c 69 66 20 53 51 4c  t4+1);.#elif SQL
8640: 49 54 45 5f 44 45 42 55 47 0a 20 20 61 73 73 65  ITE_DEBUG.  asse
8650: 72 74 28 20 69 50 61 72 61 6d 3d 3d 53 54 41 54  rt( iParam==STAT
8660: 5f 47 45 54 5f 53 54 41 54 31 20 29 3b 0a 23 65  _GET_STAT1 );.#e
8670: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
8680: 41 4d 45 54 45 52 28 20 69 50 61 72 61 6d 20 29  AMETER( iParam )
8690: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
86a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
86b0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
86c0: 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 4f 75   regStat4, regOu
86d0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
86e0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73         (char*)&s
86f0: 74 61 74 47 65 74 46 75 6e 63 64 65 66 2c 20 50  tatGetFuncdef, P
8700: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 73 71  4_FUNCDEF);.  sq
8710: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8720: 35 28 76 2c 20 31 20 2b 20 49 73 53 74 61 74 33  5(v, 1 + IsStat3
8730: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  4);.}../*.** Gen
8740: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
8750: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
8760: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
8770: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
8780: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a   single table..*
8790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
87a0: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20  alyzeOneTable(. 
87b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
87c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
87d0: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
87e0: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62  pTab,     /* Tab
87f0: 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63 65 73  le whose indices
8800: 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61 6c 79   are to be analy
8810: 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
8820: 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49 66 20  pOnlyIdx, /* If 
8830: 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79 20 61  not NULL, only a
8840: 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e 65 20  nalyze this one 
8850: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
8860: 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a 20 49  StatCur,    /* I
8870: 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75 72 73  ndex of VdbeCurs
8880: 6f 72 20 74 68 61 74 20 77 72 69 74 65 73 20 74  or that writes t
8890: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
88a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
88b0: 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  Mem,        /* A
88c0: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
88d0: 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69 6e 20  locations begin 
88e0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  here */.  int iT
88f0: 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ab         /* Ne
8900: 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75 72  xt available cur
8910: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  sor */.){.  sqli
8920: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8930: 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61 74 61  ->db;    /* Data
8940: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
8950: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8970: 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62 65 69   An index to bei
8980: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
8990: 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89b0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
89c0: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
89d0: 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  yzed */.  int iT
89e0: 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  abCur;          
89f0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
8a00: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65  cursor */.  Vdbe
8a10: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
8a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8a30: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
8a40: 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70 20 2a  being built up *
8a50: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a80: 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72 6f 52   */.  int jZeroR
8a90: 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ows = -1;       
8aa0: 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f 6d 20     /* Jump from 
8ab0: 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72 20 6f  here if number o
8ac0: 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f 20 2a  f rows is zero *
8ad0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
8b00: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
8b10: 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20 6e 65   pTab */.  u8 ne
8b20: 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31 3b 20  edTableCnt = 1; 
8b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8b40: 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74 61 62  to count the tab
8b50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  le */.  int regN
8b60: 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b  ewRowid = iMem++
8b70: 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f  ;    /* Rowid fo
8b80: 72 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 72  r the inserted r
8b90: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
8ba0: 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d 2b 2b  egStat4 = iMem++
8bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
8bc0: 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74 61 74  ter to hold Stat
8bd0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f  4Accum object */
8be0: 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67 20 3d  .  int regChng =
8bf0: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
8c00: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 61 6e  /* Index of chan
8c10: 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c 64 20  ged index field 
8c20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8c30: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
8c40: 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 72 65 67  _STAT4.  int reg
8c50: 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20  Rowid = iMem++; 
8c60: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 61        /* Rowid a
8c70: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
8c80: 6f 20 73 74 61 74 5f 70 75 73 68 28 29 20 2a 2f  o stat_push() */
8c90: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65  .#endif.  int re
8ca0: 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20  gTemp = iMem++; 
8cb0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
8cc0: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
8cd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 61 62   */.  int regTab
8ce0: 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  name = iMem++;  
8cf0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
8d00: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 20  ontaining table 
8d10: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  name */.  int re
8d20: 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b  gIdxname = iMem+
8d30: 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  +;     /* Regist
8d40: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e  er containing in
8d50: 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  dex name */.  in
8d60: 74 20 72 65 67 53 74 61 74 31 20 3d 20 69 4d 65  t regStat1 = iMe
8d70: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  m++;       /* Va
8d80: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lue for the stat
8d90: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74   column of sqlit
8da0: 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 69 6e 74  e_stat1 */.  int
8db0: 20 72 65 67 50 72 65 76 20 3d 20 69 4d 65 6d 3b   regPrev = iMem;
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 55 53            /* MUS
8dd0: 54 20 42 45 20 4c 41 53 54 20 28 73 65 65 20 62  T BE LAST (see b
8de0: 65 6c 6f 77 29 20 2a 2f 0a 23 69 66 64 65 66 20  elow) */.#ifdef 
8df0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
8e00: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 54  EUPDATE_HOOK.  T
8e10: 61 62 6c 65 20 2a 70 53 74 61 74 31 20 3d 20 30  able *pStat1 = 0
8e20: 3b 20 0a 23 65 6e 64 69 66 0a 0a 20 20 70 50 61  ; .#endif..  pPa
8e30: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28  rse->nMem = MAX(
8e40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 69 4d  pParse->nMem, iM
8e50: 65 6d 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  em);.  v = sqlit
8e60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
8e70: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
8e80: 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20   NEVER(pTab==0) 
8e90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
8ea0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74   }.  if( pTab->t
8eb0: 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  num==0 ){.    /*
8ec0: 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73   Do not gather s
8ed0: 74 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69 65  tatistics on vie
8ee0: 77 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  ws or virtual ta
8ef0: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  bles */.    retu
8f00: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  rn;.  }.  if( sq
8f10: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 73  lite3_strlike("s
8f20: 71 6c 69 74 65 5c 5c 5f 25 22 2c 20 70 54 61 62  qlite\\_%", pTab
8f30: 2d 3e 7a 4e 61 6d 65 2c 20 27 5c 5c 27 29 3d 3d  ->zName, '\\')==
8f40: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  0 ){.    /* Do n
8f50: 6f 74 20 67 61 74 68 65 72 20 73 74 61 74 69 73  ot gather statis
8f60: 74 69 63 73 20 6f 6e 20 73 79 73 74 65 6d 20 74  tics on system t
8f70: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  ables */.    ret
8f80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
8f90: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
8fa0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
8fb0: 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  b) );.  iDb = sq
8fc0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
8fd0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
8fe0: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
8ff0: 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 61 73 73   iDb>=0 );.  ass
9000: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
9010: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
9020: 69 44 62 2c 20 30 29 20 29 3b 0a 23 69 66 6e 64  iDb, 0) );.#ifnd
9030: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9040: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
9050: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
9060: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
9070: 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54 61 62  TE_ANALYZE, pTab
9080: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
9090: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
90a0: 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
90b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
90c0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
90d0: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
90e0: 41 54 45 5f 48 4f 4f 4b 0a 20 20 69 66 28 20 64  ATE_HOOK.  if( d
90f0: 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
9100: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 53 74  lback ){.    pSt
9110: 61 74 31 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  at1 = (Table*)sq
9120: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9130: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
9140: 6c 65 29 20 2b 20 31 33 29 3b 0a 20 20 20 20 69  le) + 13);.    i
9150: 66 28 20 70 53 74 61 74 31 3d 3d 30 20 29 20 72  f( pStat1==0 ) r
9160: 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 74 61 74  eturn;.    pStat
9170: 31 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  1->zName = (char
9180: 2a 29 26 70 53 74 61 74 31 5b 31 5d 3b 0a 20 20  *)&pStat1[1];.  
9190: 20 20 6d 65 6d 63 70 79 28 70 53 74 61 74 31 2d    memcpy(pStat1-
91a0: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
91b0: 73 74 61 74 31 22 2c 20 31 33 29 3b 0a 20 20 20  stat1", 13);.   
91c0: 20 70 53 74 61 74 31 2d 3e 6e 43 6f 6c 20 3d 20   pStat1->nCol = 
91d0: 33 3b 0a 20 20 20 20 70 53 74 61 74 31 2d 3e 69  3;.    pStat1->i
91e0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 73  PKey = -1;.    s
91f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9200: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
9210: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30  OP_Noop, 0, 0, 0
9220: 2c 28 63 68 61 72 2a 29 70 53 74 61 74 31 2c 50  ,(char*)pStat1,P
9230: 34 5f 44 59 4e 42 4c 4f 42 29 3b 0a 20 20 7d 0a  4_DYNBLOB);.  }.
9240: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74  #endif..  /* Est
9250: 61 62 6c 69 73 68 20 61 20 72 65 61 64 2d 6c 6f  ablish a read-lo
9260: 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
9270: 61 74 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  at the shared-ca
9280: 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a  che level. .  **
9290: 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
92a0: 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  y cursor on the 
92b0: 74 61 62 6c 65 2e 20 41 6c 73 6f 20 61 6c 6c 6f  table. Also allo
92c0: 63 61 74 65 20 61 20 63 75 72 73 6f 72 20 6e 75  cate a cursor nu
92d0: 6d 62 65 72 0a 20 20 2a 2a 20 74 6f 20 75 73 65  mber.  ** to use
92e0: 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 69 6e   for scanning in
92f0: 64 65 78 65 73 20 28 69 49 64 78 43 75 72 29 2e  dexes (iIdxCur).
9300: 20 4e 6f 20 69 6e 64 65 78 20 63 75 72 73 6f 72   No index cursor
9310: 20 69 73 20 6f 70 65 6e 65 64 20 61 74 0a 20 20   is opened at.  
9320: 2a 2a 20 74 68 69 73 20 74 69 6d 65 20 74 68 6f  ** this time tho
9330: 75 67 68 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ugh.  */.  sqlit
9340: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
9350: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
9360: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
9370: 61 6d 65 29 3b 0a 20 20 69 54 61 62 43 75 72 20  ame);.  iTabCur 
9380: 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 69 49 64 78  = iTab++;.  iIdx
9390: 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20  Cur = iTab++;.  
93a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 4d  pParse->nTab = M
93b0: 41 58 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2c  AX(pParse->nTab,
93c0: 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
93d0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
93e0: 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c  e, iTabCur, iDb,
93f0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
9400: 61 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ad);.  sqlite3Vd
9410: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
9420: 72 65 67 54 61 62 6e 61 6d 65 2c 20 70 54 61 62  regTabname, pTab
9430: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  ->zName);..  for
9440: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9450: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9460: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9470: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9490: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
94a0: 6d 6e 73 20 69 6e 20 70 49 64 78 2e 20 22 4e 22  mns in pIdx. "N"
94b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
94c0: 52 65 77 69 6e 64 3b 20 20 20 20 20 20 20 20 20  Rewind;         
94d0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
94e0: 20 6f 66 20 22 4f 50 5f 52 65 77 69 6e 64 20 69   of "OP_Rewind i
94f0: 49 64 78 43 75 72 22 20 2a 2f 0a 20 20 20 20 69  IdxCur" */.    i
9500: 6e 74 20 61 64 64 72 4e 65 78 74 52 6f 77 3b 20  nt addrNextRow; 
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9520: 41 64 64 72 65 73 73 20 6f 66 20 22 6e 65 78 74  Address of "next
9530: 5f 72 6f 77 3a 22 20 2a 2f 0a 20 20 20 20 63 6f  _row:" */.    co
9540: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
9550: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me;         /* N
9560: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
9570: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
9580: 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
9590: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
95a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 65  of columns to te
95b0: 73 74 20 66 6f 72 20 63 68 61 6e 67 65 73 20 2a  st for changes *
95c0: 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f 6e 6c 79  /..    if( pOnly
95d0: 49 64 78 20 26 26 20 70 4f 6e 6c 79 49 64 78 21  Idx && pOnlyIdx!
95e0: 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65  =pIdx ) continue
95f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
9600: 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
9610: 20 29 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20   ) needTableCnt 
9620: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 48 61  = 0;.    if( !Ha
9630: 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
9640: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
9650: 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
9660: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b   nCol = pIdx->nK
9670: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7a 49 64  eyCol;.      zId
9680: 78 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  xName = pTab->zN
9690: 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 54  ame;.      nColT
96a0: 65 73 74 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a  est = nCol - 1;.
96b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
96c0: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
96d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7a 49 64  olumn;.      zId
96e0: 78 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 7a 4e  xName = pIdx->zN
96f0: 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 54  ame;.      nColT
9700: 65 73 74 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71  est = pIdx->uniq
9710: 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78 2d 3e  NotNull ? pIdx->
9720: 6e 4b 65 79 43 6f 6c 2d 31 20 3a 20 6e 43 6f 6c  nKeyCol-1 : nCol
9730: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
9740: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 72  * Populate the r
9750: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
9760: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ng the index nam
9770: 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
9780: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
9790: 76 2c 20 72 65 67 49 64 78 6e 61 6d 65 2c 20 7a  v, regIdxname, z
97a0: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 20 20 56 64  IdxName);.    Vd
97b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  beComment((v, "A
97c0: 6e 61 6c 79 73 69 73 20 66 6f 72 20 25 73 2e 25  nalysis for %s.%
97d0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
97e0: 20 7a 49 64 78 4e 61 6d 65 29 29 3b 0a 0a 20 20   zIdxName));..  
97f0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 73 65 75    /*.    ** Pseu
9800: 64 6f 2d 63 6f 64 65 20 66 6f 72 20 6c 6f 6f 70  do-code for loop
9810: 20 74 68 61 74 20 63 61 6c 6c 73 20 73 74 61 74   that calls stat
9820: 5f 70 75 73 68 28 29 3a 0a 20 20 20 20 2a 2a 0a  _push():.    **.
9830: 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64 20      **   Rewind 
9840: 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20  csr.    **   if 
9850: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 65 6e  eof(csr) goto en
9860: 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20 20 2a  d_of_scan;.    *
9870: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a  *   regChng = 0.
9880: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68      **   goto ch
9890: 6e 67 5f 61 64 64 72 5f 30 3b 0a 20 20 20 20 2a  ng_addr_0;.    *
98a0: 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72  *.    **  next_r
98b0: 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  ow:.    **   reg
98c0: 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20  Chng = 0.    ** 
98d0: 20 20 69 66 28 20 69 64 78 28 30 29 20 21 3d 20    if( idx(0) != 
98e0: 72 65 67 50 72 65 76 28 30 29 20 29 20 67 6f 74  regPrev(0) ) got
98f0: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20  o chng_addr_0.  
9900: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
9910: 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20   1.    **   if( 
9920: 69 64 78 28 31 29 20 21 3d 20 72 65 67 50 72 65  idx(1) != regPre
9930: 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68 6e 67  v(1) ) goto chng
9940: 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a 20 20  _addr_1.    **  
9950: 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 72 65   ....    **   re
9960: 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20 2a 2a  gChng = N.    **
9970: 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64     goto chng_add
9980: 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r_N.    **.    *
9990: 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a  *  chng_addr_0:.
99a0: 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76      **   regPrev
99b0: 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20  (0) = idx(0).   
99c0: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 31   **  chng_addr_1
99d0: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72  :.    **   regPr
99e0: 65 76 28 31 29 20 3d 20 69 64 78 28 31 29 0a 20  ev(1) = idx(1). 
99f0: 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a     **  ....    *
9a00: 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64 44 69 73  *.    **  endDis
9a10: 74 69 6e 63 74 54 65 73 74 3a 0a 20 20 20 20 2a  tinctTest:.    *
9a20: 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69  *   regRowid = i
9a30: 64 78 28 72 6f 77 69 64 29 0a 20 20 20 20 2a 2a  dx(rowid).    **
9a40: 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20     stat_push(P, 
9a50: 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69  regChng, regRowi
9a60: 64 29 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74  d).    **   Next
9a70: 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66   csr.    **   if
9a80: 20 21 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20   !eof(csr) goto 
9a90: 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a  next_row;.    **
9aa0: 0a 20 20 20 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f  .    **  end_of_
9ab0: 73 63 61 6e 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20  scan:.    */..  
9ac0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
9ad0: 68 65 72 65 20 61 72 65 20 65 6e 6f 75 67 68 20  here are enough 
9ae0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6c 6c  memory cells all
9af0: 6f 63 61 74 65 64 20 74 6f 20 61 63 63 6f 6d 6d  ocated to accomm
9b00: 6f 64 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  odate .    ** th
9b10: 65 20 72 65 67 50 72 65 76 20 61 72 72 61 79 20  e regPrev array 
9b20: 61 6e 64 20 61 20 74 72 61 69 6c 69 6e 67 20 72  and a trailing r
9b30: 6f 77 69 64 20 28 74 68 65 20 72 6f 77 69 64 20  owid (the rowid 
9b40: 73 6c 6f 74 20 69 73 20 72 65 71 75 69 72 65 64  slot is required
9b50: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 62 75 69  .    ** when bui
9b60: 6c 64 69 6e 67 20 61 20 72 65 63 6f 72 64 20 74  lding a record t
9b70: 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  o insert into th
9b80: 65 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  e sample column 
9b90: 6f 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  of .    ** the s
9ba0: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
9bb0: 65 2e 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  e.  */.    pPars
9bc0: 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50  e->nMem = MAX(pP
9bd0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50  arse->nMem, regP
9be0: 72 65 76 2b 6e 43 6f 6c 54 65 73 74 29 3b 0a 0a  rev+nColTest);..
9bf0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
9c00: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
9c10: 6e 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  n the index bein
9c20: 67 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20  g analyzed. */. 
9c30: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
9c40: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
9c50: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
9c60: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73  Schema) );.    s
9c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9c80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
9c90: 20 69 49 64 78 43 75 72 2c 20 70 49 64 78 2d 3e   iIdxCur, pIdx->
9ca0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
9cb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
9cc0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
9cd0: 70 49 64 78 29 3b 0a 20 20 20 20 56 64 62 65 43  pIdx);.    VdbeC
9ce0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
9cf0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
9d00: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  .    /* Invoke t
9d10: 68 65 20 73 74 61 74 5f 69 6e 69 74 28 29 20 66  he stat_init() f
9d20: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 61 72 67  unction. The arg
9d30: 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20 20 20 20  uments are:.    
9d40: 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 20 28 31  ** .    **    (1
9d50: 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  ) the number of 
9d60: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
9d70: 6e 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74  ndex including t
9d80: 68 65 20 72 6f 77 69 64 0a 20 20 20 20 2a 2a 20  he rowid.    ** 
9d90: 20 20 20 20 20 20 20 28 6f 72 20 66 6f 72 20 61         (or for a
9da0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
9db0: 61 62 6c 65 2c 20 74 68 65 20 6e 75 6d 62 65 72  able, the number
9dc0: 20 6f 66 20 50 4b 20 63 6f 6c 75 6d 6e 73 29 2c   of PK columns),
9dd0: 0a 20 20 20 20 2a 2a 20 20 20 20 28 32 29 20 74  .    **    (2) t
9de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9df0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6b 65 79 20  umns in the key 
9e00: 77 69 74 68 6f 75 74 20 74 68 65 20 72 6f 77 69  without the rowi
9e10: 64 2f 70 6b 0a 20 20 20 20 2a 2a 20 20 20 20 28  d/pk.    **    (
9e20: 33 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  3) the number of
9e30: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
9e40: 65 78 2c 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex,.    **.    *
9e50: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
9e60: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  rd argument is o
9e70: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41  nly used for STA
9e80: 54 33 20 61 6e 64 20 53 54 41 54 34 0a 20 20 20  T3 and STAT4.   
9e90: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
9ea0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
9eb0: 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
9ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9ed0: 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43   OP_Count, iIdxC
9ee0: 75 72 2c 20 72 65 67 53 74 61 74 34 2b 33 29 3b  ur, regStat4+3);
9ef0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
9f00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9f10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
9f20: 6c 2c 20 72 65 67 53 74 61 74 34 2b 31 29 3b 0a  l, regStat4+1);.
9f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9f40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9f50: 67 65 72 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ger, pIdx->nKeyC
9f60: 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b 32 29 3b  ol, regStat4+2);
9f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9f80: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
9f90: 63 74 69 6f 6e 30 2c 20 30 2c 20 72 65 67 53 74  ction0, 0, regSt
9fa0: 61 74 34 2b 31 2c 20 72 65 67 53 74 61 74 34 2c  at4+1, regStat4,
9fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9fc0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74        (char*)&st
9fd0: 61 74 49 6e 69 74 46 75 6e 63 64 65 66 2c 20 50  atInitFuncdef, P
9fe0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
9ff0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a000: 65 50 35 28 76 2c 20 32 2b 49 73 53 74 61 74 33  eP5(v, 2+IsStat3
a010: 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6d 70 6c  4);..    /* Impl
a020: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
a030: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
a040: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77   **.    **   Rew
a050: 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20  ind csr.    **  
a060: 20 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74   if eof(csr) got
a070: 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20  o end_of_scan;. 
a080: 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20     **   regChng 
a090: 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74  = 0.    **   got
a0a0: 6f 20 6e 65 78 74 5f 70 75 73 68 5f 30 3b 0a 20  o next_push_0;. 
a0b0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
a0c0: 20 61 64 64 72 52 65 77 69 6e 64 20 3d 20 73 71   addrRewind = sq
a0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a0e0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49  v, OP_Rewind, iI
a0f0: 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65  dxCur);.    Vdbe
a100: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a120: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a130: 2c 20 30 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20  , 0, regChng);. 
a140: 20 20 20 61 64 64 72 4e 65 78 74 52 6f 77 20 3d     addrNextRow =
a150: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a160: 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
a170: 20 69 66 28 20 6e 43 6f 6c 54 65 73 74 3e 30 20   if( nColTest>0 
a180: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64  ){.      int end
a190: 44 69 73 74 69 6e 63 74 54 65 73 74 20 3d 20 73  DistinctTest = s
a1a0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a1b0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
a1c0: 74 20 2a 61 47 6f 74 6f 43 68 6e 67 3b 20 20 20  t *aGotoChng;   
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a1e0: 72 72 61 79 20 6f 66 20 6a 75 6d 70 20 69 6e 73  rray of jump ins
a1f0: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
a200: 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 47 6f 74  es */.      aGot
a210: 6f 43 68 6e 67 20 3d 20 73 71 6c 69 74 65 33 44  oChng = sqlite3D
a220: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
a230: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f   sizeof(int)*nCo
a240: 6c 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  lTest);.      if
a250: 28 20 61 47 6f 74 6f 43 68 6e 67 3d 3d 30 20 29  ( aGotoChng==0 )
a260: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
a270: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 6e    /*.      **  n
a280: 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 20 20 2a  ext_row:.      *
a290: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a  *   regChng = 0.
a2a0: 20 20 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69        **   if( i
a2b0: 64 78 28 30 29 20 21 3d 20 72 65 67 50 72 65 76  dx(0) != regPrev
a2c0: 28 30 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f  (0) ) goto chng_
a2d0: 61 64 64 72 5f 30 0a 20 20 20 20 20 20 2a 2a 20  addr_0.      ** 
a2e0: 20 20 72 65 67 43 68 6e 67 20 3d 20 31 0a 20 20    regChng = 1.  
a2f0: 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78      **   if( idx
a300: 28 31 29 20 21 3d 20 72 65 67 50 72 65 76 28 31  (1) != regPrev(1
a310: 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64  ) ) goto chng_ad
a320: 64 72 5f 31 0a 20 20 20 20 20 20 2a 2a 20 20 20  dr_1.      **   
a330: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  ....      **   r
a340: 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20 20  egChng = N.     
a350: 20 2a 2a 20 20 20 67 6f 74 6f 20 65 6e 64 44 69   **   goto endDi
a360: 73 74 69 6e 63 74 54 65 73 74 0a 20 20 20 20 20  stinctTest.     
a370: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a380: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
a390: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61  P_Goto);.      a
a3a0: 64 64 72 4e 65 78 74 52 6f 77 20 3d 20 73 71 6c  ddrNextRow = sql
a3b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a3c0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66  ddr(v);.      if
a3d0: 28 20 6e 43 6f 6c 54 65 73 74 3d 3d 31 20 26 26  ( nColTest==1 &&
a3e0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
a3f0: 31 20 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64  1 && IsUniqueInd
a400: 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20  ex(pIdx) ){.    
a410: 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 73 69 6e      /* For a sin
a420: 67 6c 65 2d 63 6f 6c 75 6d 6e 20 55 4e 49 51 55  gle-column UNIQU
a430: 45 20 69 6e 64 65 78 2c 20 6f 6e 63 65 20 77 65  E index, once we
a440: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 6e 6f   have found a no
a450: 6e 2d 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 2a  n-NULL.        *
a460: 2a 20 72 6f 77 2c 20 77 65 20 6b 6e 6f 77 20 74  * row, we know t
a470: 68 61 74 20 61 6c 6c 20 74 68 65 20 72 65 73 74  hat all the rest
a480: 20 77 69 6c 6c 20 62 65 20 64 69 73 74 69 6e 63   will be distinc
a490: 74 2c 20 73 6f 20 73 6b 69 70 20 0a 20 20 20 20  t, so skip .    
a4a0: 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
a4b0: 74 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 74  t distinctness t
a4c0: 65 73 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ests. */.       
a4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a4e0: 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
a4f0: 2c 20 72 65 67 50 72 65 76 2c 20 65 6e 64 44 69  , regPrev, endDi
a500: 73 74 69 6e 63 74 54 65 73 74 29 3b 0a 20 20 20  stinctTest);.   
a510: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
a520: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
a530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a540: 43 6f 6c 54 65 73 74 3b 20 69 2b 2b 29 7b 0a 20  ColTest; i++){. 
a550: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 43 6f         char *pCo
a560: 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ll = (char*)sqli
a570: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
a580: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
a590: 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  zColl[i]);.     
a5a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a5c0: 65 72 2c 20 69 2c 20 72 65 67 43 68 6e 67 29 3b  er, i, regChng);
a5d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a5e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a5f0: 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
a600: 2c 20 69 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20  , i, regTemp);. 
a610: 20 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67         aGotoChng
a620: 5b 69 5d 20 3d 20 0a 20 20 20 20 20 20 20 20 73  [i] = .        s
a630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a640: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 54 65  (v, OP_Ne, regTe
a650: 6d 70 2c 20 30 2c 20 72 65 67 50 72 65 76 2b 69  mp, 0, regPrev+i
a660: 2c 20 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  , pColl, P4_COLL
a670: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 73 71  SEQ);.        sq
a680: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a690: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
a6a0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
a6b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a6d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a6e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
a6f0: 6c 54 65 73 74 2c 20 72 65 67 43 68 6e 67 29 3b  lTest, regChng);
a700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a710: 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 44 69 73  beGoto(v, endDis
a720: 74 69 6e 63 74 54 65 73 74 29 3b 0a 20 20 0a 20  tinctTest);.  . 
a730: 20 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20   .      /*.     
a740: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 30   **  chng_addr_0
a750: 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  :.      **   reg
a760: 50 72 65 76 28 30 29 20 3d 20 69 64 78 28 30 29  Prev(0) = idx(0)
a770: 0a 20 20 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  .      **  chng_
a780: 61 64 64 72 5f 31 3a 0a 20 20 20 20 20 20 2a 2a  addr_1:.      **
a790: 20 20 20 72 65 67 50 72 65 76 28 31 29 20 3d 20     regPrev(1) = 
a7a0: 69 64 78 28 31 29 0a 20 20 20 20 20 20 2a 2a 20  idx(1).      ** 
a7b0: 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ....      */.  
a7c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
a7d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e  umpHere(v, addrN
a7e0: 65 78 74 52 6f 77 2d 31 29 3b 0a 20 20 20 20 20  extRow-1);.     
a7f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
a800: 54 65 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Test; i++){.    
a810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
a820: 75 6d 70 48 65 72 65 28 76 2c 20 61 47 6f 74 6f  umpHere(v, aGoto
a830: 43 68 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Chng[i]);.      
a840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a850: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
a860: 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72 65  , iIdxCur, i, re
a870: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
a880: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a890: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a8a0: 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65  v, endDistinctTe
a8b0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
a8c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 47 6f  e3DbFree(db, aGo
a8d0: 74 6f 43 68 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  toChng);.    }. 
a8e0: 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
a8f0: 20 63 68 6e 67 5f 61 64 64 72 5f 4e 3a 0a 20 20   chng_addr_N:.  
a900: 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20    **   regRowid 
a910: 3d 20 69 64 78 28 72 6f 77 69 64 29 20 20 20 20  = idx(rowid)    
a920: 20 20 20 20 20 20 20 20 2f 2f 20 53 54 41 54 33          // STAT3
a930: 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  4 only.    **   
a940: 73 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65 67  stat_push(P, reg
a950: 43 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29 20  Chng, regRowid) 
a960: 20 2f 2f 20 33 72 64 20 70 61 72 61 6d 65 74 65   // 3rd paramete
a970: 72 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20  r STAT34 only.  
a980: 20 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72 0a    **   Next csr.
a990: 20 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f 66      **   if !eof
a9a0: 28 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74 5f  (csr) goto next_
a9b0: 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a 23 69 66 64  row;.    */.#ifd
a9c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a9d0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
a9e0: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
a9f0: 6f 77 69 64 3d 3d 28 72 65 67 53 74 61 74 34 2b  owid==(regStat4+
aa00: 32 29 20 29 3b 0a 20 20 20 20 69 66 28 20 48 61  2) );.    if( Ha
aa10: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
aa20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aa30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
aa40: 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
aa50: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
aa60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
aa70: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
aa80: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
aa90: 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a  (pIdx->pTable);.
aaa0: 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6b 2c 20        int j, k, 
aab0: 72 65 67 4b 65 79 3b 0a 20 20 20 20 20 20 72 65  regKey;.      re
aac0: 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  gKey = sqlite3Ge
aad0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
aae0: 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
aaf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
ab00: 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
ab10: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
ab20: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
ab30: 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
ab40: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
ab50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ab60: 20 6b 3e 3d 30 20 26 26 20 6b 3c 70 49 64 78 2d   k>=0 && k<pIdx-
ab70: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
ab80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
aba0: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20  mn, iIdxCur, k, 
abb0: 72 65 67 4b 65 79 2b 6a 29 3b 0a 20 20 20 20 20  regKey+j);.     
abc0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
abd0: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 61  v, "%s", pTab->a
abe0: 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  Col[pPk->aiColum
abf0: 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20  n[j]].zName));. 
ac00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ac10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ac20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ac30: 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b   regKey, pPk->nK
ac40: 65 79 43 6f 6c 2c 20 72 65 67 52 6f 77 69 64 29  eyCol, regRowid)
ac50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
ac60: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
ac70: 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c 20  pParse, regKey, 
ac80: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  pPk->nKeyCol);. 
ac90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
aca0: 61 73 73 65 72 74 28 20 72 65 67 43 68 6e 67 3d  assert( regChng=
acb0: 3d 28 72 65 67 53 74 61 74 34 2b 31 29 20 29 3b  =(regStat4+1) );
acc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
acd0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
ace0: 63 74 69 6f 6e 30 2c 20 31 2c 20 72 65 67 53 74  ction0, 1, regSt
acf0: 61 74 34 2c 20 72 65 67 54 65 6d 70 2c 0a 20 20  at4, regTemp,.  
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74 50     (char*)&statP
ad20: 75 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f 46  ushFuncdef, P4_F
ad30: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
ad40: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
ad50: 28 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29 3b  (v, 2+IsStat34);
ad60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ad70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
ad80: 74 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  t, iIdxCur, addr
ad90: 4e 65 78 74 52 6f 77 29 3b 20 56 64 62 65 43 6f  NextRow); VdbeCo
ada0: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
adb0: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
adc0: 20 74 6f 20 74 68 65 20 73 74 61 74 31 20 74 61   to the stat1 ta
add0: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c 6c  ble. */.    call
ade0: 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74  StatGet(v, regSt
adf0: 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 53 54  at4, STAT_GET_ST
ae00: 41 54 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a  AT1, regStat1);.
ae10: 20 20 20 20 61 73 73 65 72 74 28 20 22 42 42 42      assert( "BBB
ae20: 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  "[0]==SQLITE_AFF
ae30: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c  _TEXT );.    sql
ae40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ae50: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ae60: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20   regTabname, 3, 
ae70: 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20  regTemp, "BBB", 
ae80: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
ae90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aea0: 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43  NewRowid, iStatC
aeb0: 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  ur, regNewRowid)
aec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aed0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
aee0: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20  sert, iStatCur, 
aef0: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
af00: 6f 77 69 64 29 3b 0a 23 69 66 64 65 66 20 53 51  owid);.#ifdef SQ
af10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
af20: 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73  PDATE_HOOK.    s
af30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
af40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
af50: 29 70 53 74 61 74 31 2c 20 50 34 5f 54 41 42 4c  )pStat1, P4_TABL
af60: 45 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  E);.#endif.    s
af70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
af80: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
af90: 45 4e 44 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  END);..    /* Ad
afa0: 64 20 74 68 65 20 65 6e 74 72 69 65 73 20 74 6f  d the entries to
afb0: 20 74 68 65 20 73 74 61 74 33 20 6f 72 20 73 74   the stat3 or st
afc0: 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69  at4 table. */.#i
afd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
afe0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
aff0: 34 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  4.    {.      in
b000: 74 20 72 65 67 45 71 20 3d 20 72 65 67 53 74 61  t regEq = regSta
b010: 74 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  t1;.      int re
b020: 67 4c 74 20 3d 20 72 65 67 53 74 61 74 31 2b 31  gLt = regStat1+1
b030: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 44  ;.      int regD
b040: 4c 74 20 3d 20 72 65 67 53 74 61 74 31 2b 32 3b  Lt = regStat1+2;
b050: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 53 61  .      int regSa
b060: 6d 70 6c 65 20 3d 20 72 65 67 53 74 61 74 31 2b  mple = regStat1+
b070: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  3;.      int reg
b080: 43 6f 6c 20 3d 20 72 65 67 53 74 61 74 31 2b 34  Col = regStat1+4
b090: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 53  ;.      int regS
b0a0: 61 6d 70 6c 65 52 6f 77 69 64 20 3d 20 72 65 67  ampleRowid = reg
b0b0: 43 6f 6c 20 2b 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col + nCol;.    
b0c0: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a    int addrNext;.
b0d0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 73        int addrIs
b0e0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 73  Null;.      u8 s
b0f0: 65 65 6b 4f 70 20 3d 20 48 61 73 52 6f 77 69 64  eekOp = HasRowid
b100: 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e 6f 74 45  (pTab) ? OP_NotE
b110: 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f 74 46 6f  xists : OP_NotFo
b120: 75 6e 64 3b 0a 0a 20 20 20 20 20 20 70 50 61 72  und;..      pPar
b130: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70  se->nMem = MAX(p
b140: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67  Parse->nMem, reg
b150: 43 6f 6c 2b 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20  Col+nCol);..    
b160: 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
b170: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b180: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 61  ddr(v);.      ca
b190: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
b1a0: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
b1b0: 52 4f 57 49 44 2c 20 72 65 67 53 61 6d 70 6c 65  ROWID, regSample
b1c0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64  Rowid);.      ad
b1d0: 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  drIsNull = sqlit
b1e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b1f0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 53 61  OP_IsNull, regSa
b200: 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20 20  mpleRowid);.    
b210: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b220: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
b230: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
b240: 2c 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 2c 20  , STAT_GET_NEQ, 
b250: 72 65 67 45 71 29 3b 0a 20 20 20 20 20 20 63 61  regEq);.      ca
b260: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
b270: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
b280: 4e 4c 54 2c 20 72 65 67 4c 74 29 3b 0a 20 20 20  NLT, regLt);.   
b290: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
b2a0: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
b2b0: 5f 47 45 54 5f 4e 44 4c 54 2c 20 72 65 67 44 4c  _GET_NDLT, regDL
b2c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b2d0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
b2e0: 2c 20 73 65 65 6b 4f 70 2c 20 69 54 61 62 43 75  , seekOp, iTabCu
b2f0: 72 2c 20 61 64 64 72 4e 65 78 74 2c 20 72 65 67  r, addrNext, reg
b300: 53 61 6d 70 6c 65 52 6f 77 69 64 2c 20 30 29 3b  SampleRowid, 0);
b310: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 6b 6e 6f  .      /* We kno
b320: 77 20 74 68 61 74 20 74 68 65 20 72 65 67 53 61  w that the regSa
b330: 6d 70 6c 65 52 6f 77 69 64 20 72 6f 77 20 65 78  mpleRowid row ex
b340: 69 73 74 73 20 62 65 63 61 75 73 65 20 69 74 20  ists because it 
b350: 77 61 73 20 72 65 61 64 20 62 79 0a 20 20 20 20  was read by.    
b360: 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75    ** the previou
b370: 73 20 6c 6f 6f 70 2e 20 20 54 68 75 73 20 74 68  s loop.  Thus th
b380: 65 20 6e 6f 74 2d 66 6f 75 6e 64 20 6a 75 6d 70  e not-found jump
b390: 20 6f 66 20 73 65 65 6b 4f 70 20 77 69 6c 6c 20   of seekOp will 
b3a0: 6e 65 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 62  never.      ** b
b3b0: 65 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  e taken */.     
b3c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
b3d0: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 23 69 66 64  erTaken(v);.#ifd
b3e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b3f0: 5f 53 54 41 54 33 0a 20 20 20 20 20 20 73 71 6c  _STAT3.      sql
b400: 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
b410: 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72  IndexColumn(pPar
b420: 73 65 2c 20 70 49 64 78 2c 20 69 54 61 62 43 75  se, pIdx, iTabCu
b430: 72 2c 20 30 2c 20 72 65 67 53 61 6d 70 6c 65 29  r, 0, regSample)
b440: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 66 6f  ;.#else.      fo
b450: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b460: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b470: 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
b480: 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72  IndexColumn(pPar
b490: 73 65 2c 20 70 49 64 78 2c 20 69 54 61 62 43 75  se, pIdx, iTabCu
b4a0: 72 2c 20 69 2c 20 72 65 67 43 6f 6c 2b 69 29 3b  r, i, regCol+i);
b4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b4d0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b4e0: 64 2c 20 72 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2c  d, regCol, nCol,
b4f0: 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6e   regSample);.#en
b500: 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
b510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b520: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b530: 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67  gTabname, 6, reg
b540: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
b550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b560: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
b570: 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67 4e 65  StatCur+1, regNe
b580: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  wRowid);.      s
b590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b5a0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
b5b0: 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67 54 65  StatCur+1, regTe
b5c0: 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  mp, regNewRowid)
b5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b5e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b5f0: 47 6f 74 6f 2c 20 31 2c 20 61 64 64 72 4e 65 78  Goto, 1, addrNex
b600: 74 29 3b 20 2f 2a 20 50 31 3d 3d 31 20 66 6f 72  t); /* P1==1 for
b610: 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 2a 2f 0a   end-of-loop */.
b620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b630: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b640: 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  rIsNull);.    }.
b650: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b660: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
b670: 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 20 20 2f  _STAT4 */..    /
b680: 2a 20 45 6e 64 20 6f 66 20 61 6e 61 6c 79 73 69  * End of analysi
b690: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
b6a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b6b0: 61 64 64 72 52 65 77 69 6e 64 29 3b 0a 20 20 7d  addrRewind);.  }
b6c0: 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ...  /* Create a
b6d0: 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65 5f 73   single sqlite_s
b6e0: 74 61 74 31 20 65 6e 74 72 79 20 63 6f 6e 74 61  tat1 entry conta
b6f0: 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68  ining NULL as th
b700: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6e 61 6d  e index.  ** nam
b710: 65 20 61 6e 64 20 74 68 65 20 72 6f 77 20 63 6f  e and the row co
b720: 75 6e 74 20 61 73 20 74 68 65 20 63 6f 6e 74 65  unt as the conte
b730: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nt..  */.  if( p
b740: 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26 20 6e 65  OnlyIdx==0 && ne
b750: 65 64 54 61 62 6c 65 43 6e 74 20 29 7b 0a 20 20  edTableCnt ){.  
b760: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b770: 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  , "%s", pTab->zN
b780: 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ame));.    sqlit
b790: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b7a0: 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61 62 43 75  OP_Count, iTabCu
b7b0: 72 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20  r, regStat1);.  
b7c0: 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71    jZeroRows = sq
b7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b7e0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
b7f0: 53 74 61 74 31 29 3b 20 56 64 62 65 43 6f 76 65  Stat1); VdbeCove
b800: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
b810: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b820: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
b830: 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20 20 20 61  gIdxname);.    a
b840: 73 73 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d  ssert( "BBB"[0]=
b850: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
b860: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
b870: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
b880: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
b890: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65  abname, 3, regTe
b8a0: 6d 70 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20  mp, "BBB", 0);. 
b8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b8c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
b8d0: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72  wid, iStatCur, r
b8e0: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
b8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b900: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
b910: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 54 65   iStatCur, regTe
b920: 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  mp, regNewRowid)
b930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b940: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b950: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 23 69 66  LAG_APPEND);.#if
b960: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b970: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
b980: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b990: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
b9a0: 28 63 68 61 72 2a 29 70 53 74 61 74 31 2c 20 50  (char*)pStat1, P
b9b0: 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e 64 69 66  4_TABLE);.#endif
b9c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b9d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65 72  JumpHere(v, jZer
b9e0: 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  oRows);.  }.}...
b9f0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ba00: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 61  ode that will ca
ba10: 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  use the most rec
ba20: 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79 73  ent index analys
ba30: 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64  is to.** be load
ba40: 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c  ed into internal
ba50: 20 68 61 73 68 20 74 61 62 6c 65 73 20 77 68 65   hash tables whe
ba60: 72 65 20 69 73 20 63 61 6e 20 62 65 20 75 73 65  re is can be use
ba70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
ba80: 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 50  d loadAnalysis(P
ba90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
baa0: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
bab0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
bac0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
bad0: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
bae0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
baf0: 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c  OP_LoadAnalysis,
bb00: 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iDb);.  }.}../*
bb10: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
bb20: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
bb30: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e  n analysis of an
bb40: 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
bb50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bb60: 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28  analyzeDatabase(
bb70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
bb80: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
bb90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bba0: 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70  >db;.  Schema *p
bbb0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
bbc0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20  [iDb].pSchema;  
bbd0: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 64    /* Schema of d
bbe0: 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20  atabase iDb */. 
bbf0: 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20   HashElem *k;.  
bc00: 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20 20  int iStatCur;.  
bc10: 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20  int iMem;.  int 
bc20: 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33  iTab;..  sqlite3
bc30: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
bc40: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
bc50: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
bc60: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
bc70: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
bc80: 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54  = 3;.  openStatT
bc90: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
bca0: 2c 20 69 53 74 61 74 43 75 72 2c 20 30 2c 20 30  , iStatCur, 0, 0
bcb0: 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61 72  );.  iMem = pPar
bcc0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54  se->nMem+1;.  iT
bcd0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
bce0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
bcf0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
bd00: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
bd10: 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  );.  for(k=sqlit
bd20: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
bd30: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b  ema->tblHash); k
bd40: 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
bd50: 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(k)){.    Tabl
bd60: 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65  e *pTab = (Table
bd70: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
bd80: 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65  (k);.    analyze
bd90: 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  OneTable(pParse,
bda0: 20 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74 43   pTab, 0, iStatC
bdb0: 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62 29 3b  ur, iMem, iTab);
bdc0: 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c 79  .  }.  loadAnaly
bdd0: 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29  sis(pParse, iDb)
bde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
bdf0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
be00: 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ll do an analysi
be10: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61  s of a single ta
be20: 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74 61  ble in.** a data
be30: 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79 49  base.  If pOnlyI
be40: 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  dx is not NULL t
be50: 68 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e 67  hen it is a sing
be60: 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20 70  le index.** in p
be70: 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64 20  Tab that should 
be80: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a  be analyzed..*/.
be90: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
bea0: 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  yzeTable(Parse *
beb0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
bec0: 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e 6c  Tab, Index *pOnl
bed0: 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44 62  yIdx){.  int iDb
bee0: 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72  ;.  int iStatCur
bef0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
bf00: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
bf10: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
bf20: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50  ldsAllMutexes(pP
bf30: 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69  arse->db) );.  i
bf40: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
bf50: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
bf60: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
bf70: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ema);.  sqlite3B
bf80: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
bf90: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
bfa0: 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d  b);.  iStatCur =
bfb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
bfc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
bfd0: 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49   3;.  if( pOnlyI
bfe0: 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53 74  dx ){.    openSt
bff0: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
c000: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70  iDb, iStatCur, p
c010: 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  OnlyIdx->zName, 
c020: 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  "idx");.  }else{
c030: 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62  .    openStatTab
c040: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
c050: 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d 3e  iStatCur, pTab->
c060: 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a 20  zName, "tbl");. 
c070: 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54   }.  analyzeOneT
c080: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
c090: 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53 74  b, pOnlyIdx, iSt
c0a0: 61 74 43 75 72 2c 70 50 61 72 73 65 2d 3e 6e 4d  atCur,pParse->nM
c0b0: 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e 54 61  em+1,pParse->nTa
c0c0: 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73  b);.  loadAnalys
c0d0: 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  is(pParse, iDb);
c0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c0f0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
c100: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
c110: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
c120: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ls this routine.
c130: 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f 67  ** when it recog
c140: 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45  nizes an ANALYZE
c150: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
c160: 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20         ANALYZE  
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
c190: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
c1a0: 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20 20    <database>    
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
c1c0: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
c1d0: 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  ZE  ?<database>.
c1e0: 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
c1f0: 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   3.**.** Form 1 
c200: 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
c210: 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
c220: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
c230: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20  be analyzed..** 
c240: 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20  Form 2 analyzes 
c250: 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65 20  all indices the 
c260: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
c270: 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33  named..** Form 3
c280: 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e   analyzes all in
c290: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
c2a0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
c2b0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
c2c0: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50 61  qlite3Analyze(Pa
c2d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
c2e0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
c2f0: 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71  n *pName2){.  sq
c300: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c310: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
c320: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  b;.  int i;.  ch
c330: 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54  ar *z, *zDb;.  T
c340: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
c350: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b  dex *pIdx;.  Tok
c360: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a  en *pTableName;.
c370: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 2f 2a    Vdbe *v;..  /*
c380: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
c390: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
c3a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
c3b0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
c3c0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
c3d0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
c3e0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
c3f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
c400: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
c410: 4d 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e  Mutexes(pParse->
c420: 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  db) );.  if( SQL
c430: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
c440: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
c450: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
c460: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
c470: 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70 4e 61  pName2!=0 || pNa
c480: 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  me1==0 );.  if( 
c490: 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
c4a0: 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61   /* Form 1:  Ana
c4b0: 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67 20  lyze everything 
c4c0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
c4d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
c4e0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
c4f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
c500: 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74  Do not analyze t
c510: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
c520: 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a   */.      analyz
c530: 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  eDatabase(pParse
c540: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , i);.    }.  }e
c550: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  lse if( pName2->
c560: 6e 3d 3d 30 20 26 26 20 28 69 44 62 20 3d 20 73  n==0 && (iDb = s
c570: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
c580: 20 70 4e 61 6d 65 31 29 29 3e 3d 30 20 29 7b 0a   pName1))>=0 ){.
c590: 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74      /* Analyze t
c5a0: 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 64 20  he schema named 
c5b0: 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
c5c0: 2a 2f 0a 20 20 20 20 61 6e 61 6c 79 7a 65 44 61  */.    analyzeDa
c5d0: 74 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69  tabase(pParse, i
c5e0: 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
c5f0: 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61    /* Form 3: Ana
c600: 6c 79 7a 65 20 74 68 65 20 74 61 62 6c 65 20 6f  lyze the table o
c610: 72 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 61 73  r index named as
c620: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a   an argument */.
c630: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
c640: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
c650: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
c660: 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65  me2, &pTableName
c670: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d  );.    if( iDb>=
c680: 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  0 ){.      zDb =
c690: 20 70 4e 61 6d 65 32 2d 3e 6e 20 3f 20 64 62 2d   pName2->n ? db-
c6a0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
c6b0: 6d 65 20 3a 20 30 3b 0a 20 20 20 20 20 20 7a 20  me : 0;.      z 
c6c0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
c6d0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
c6e0: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  eName);.      if
c6f0: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( z ){.        i
c700: 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74  f( (pIdx = sqlit
c710: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
c720: 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20  z, zDb))!=0 ){. 
c730: 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65           analyze
c740: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49  Table(pParse, pI
c750: 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78  dx->pTable, pIdx
c760: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
c770: 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c   if( (pTab = sql
c780: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
c790: 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a 44  pParse, 0, z, zD
c7a0: 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))!=0 ){.      
c7b0: 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65      analyzeTable
c7c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
c7d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c7f0: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
c800: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
c810: 66 28 20 64 62 2d 3e 6e 53 71 6c 45 78 65 63 3d  f( db->nSqlExec=
c820: 3d 30 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  =0 && (v = sqlit
c830: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c840: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
c850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
c860: 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
c870: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20  }.}../*.** Used 
c880: 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
c890: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e 61  ion from the ana
c8a0: 6c 79 7a 65 72 20 72 65 61 64 65 72 20 74 68 72  lyzer reader thr
c8b0: 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ough to the.** c
c8c0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  allback routine.
c8d0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
c8e0: 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20  ct analysisInfo 
c8f0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74  analysisInfo;.st
c900: 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66  ruct analysisInf
c910: 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  o {.  sqlite3 *d
c920: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
c930: 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a  *zDatabase;.};..
c940: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
c950: 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20  argument points 
c960: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
c970: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
c980: 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20  ining a.** list 
c990: 6f 66 20 73 70 61 63 65 20 73 65 70 61 72 61 74  of space separat
c9a0: 65 64 20 69 6e 74 65 67 65 72 73 2e 20 52 65 61  ed integers. Rea
c9b0: 64 20 74 68 65 20 66 69 72 73 74 20 6e 4f 75 74  d the first nOut
c9c0: 20 6f 66 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a   of these into.*
c9d0: 2a 20 74 68 65 20 61 72 72 61 79 20 61 4f 75 74  * the array aOut
c9e0: 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  []..*/.static vo
c9f0: 69 64 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61  id decodeIntArra
ca00: 79 28 0a 20 20 63 68 61 72 20 2a 7a 49 6e 74 41  y(.  char *zIntA
ca10: 72 72 61 79 2c 20 20 20 20 20 20 20 2f 2a 20 53  rray,       /* S
ca20: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
ca30: 20 69 6e 74 20 61 72 72 61 79 20 74 6f 20 64 65   int array to de
ca40: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  code */.  int nO
ca50: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
ca60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
ca70: 6f 74 73 20 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f  ots in aOut[] */
ca80: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74  .  tRowcnt *aOut
ca90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  ,         /* Sto
caa0: 72 65 20 69 6e 74 65 67 65 72 73 20 68 65 72 65  re integers here
cab0: 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 4c   */.  LogEst *aL
cac0: 6f 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  og,          /* 
cad0: 4f 72 2c 20 69 66 20 61 4f 75 74 3d 3d 30 2c 20  Or, if aOut==0, 
cae0: 68 65 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  here */.  Index 
caf0: 2a 70 49 6e 64 65 78 20 20 20 20 20 20 20 20 20  *pIndex         
cb00: 20 2f 2a 20 48 61 6e 64 6c 65 20 65 78 74 72 61   /* Handle extra
cb10: 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20   flags for this 
cb20: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
cb30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  LL */.){.  char 
cb40: 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a  *z = zIntArray;.
cb50: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69    int c;.  int i
cb60: 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a  ;.  tRowcnt v;..
cb70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cb80: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
cb90: 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  AT4.  if( z==0 )
cba0: 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20   z = "";.#else. 
cbb0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
cbc0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
cbd0: 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f 75 74 3b  0; *z && i<nOut;
cbe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30   i++){.    v = 0
cbf0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  ;.    while( (c=
cc00: 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c  z[0])>='0' && c<
cc10: 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20  ='9' ){.      v 
cc20: 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27  = v*10 + c - '0'
cc30: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
cc40: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
cc50: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
cc60: 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28 20 61  _STAT4.    if( a
cc70: 4f 75 74 20 29 20 61 4f 75 74 5b 69 5d 20 3d 20  Out ) aOut[i] = 
cc80: 76 3b 0a 20 20 20 20 69 66 28 20 61 4c 6f 67 20  v;.    if( aLog 
cc90: 29 20 61 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69  ) aLog[i] = sqli
cca0: 74 65 33 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65  te3LogEst(v);.#e
ccb0: 6c 73 65 0a 20 20 20 20 61 73 73 65 72 74 28 20  lse.    assert( 
ccc0: 61 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 20 20 55  aOut==0 );.    U
ccd0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cce0: 61 4f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72  aOut);.    asser
ccf0: 74 28 20 61 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  t( aLog!=0 );.  
cd00: 20 20 61 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69    aLog[i] = sqli
cd10: 74 65 33 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65  te3LogEst(v);.#e
cd20: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ndif.    if( *z=
cd30: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a  =' ' ) z++;.  }.
cd40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
cd50: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
cd60: 54 41 54 34 0a 20 20 61 73 73 65 72 74 28 20 70  TAT4.  assert( p
cd70: 49 6e 64 65 78 21 3d 30 20 29 3b 20 7b 0a 23 65  Index!=0 ); {.#e
cd80: 6c 73 65 0a 20 20 69 66 28 20 70 49 6e 64 65 78  lse.  if( pIndex
cd90: 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   ){.#endif.    p
cda0: 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
cdb0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 64 65  d = 0;.    pInde
cdc0: 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20  x->noSkipScan = 
cdd0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  0;.    while( z[
cde0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0] ){.      if( 
cdf0: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
ce00: 22 75 6e 6f 72 64 65 72 65 64 2a 22 2c 20 7a 29  "unordered*", z)
ce10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
ce20: 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
ce30: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
ce40: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  se if( sqlite3_s
ce50: 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30 2d 39 5d  trglob("sz=[0-9]
ce60: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
ce70: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49       pIndex->szI
ce80: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
ce90: 6f 67 45 73 74 28 73 71 6c 69 74 65 33 41 74 6f  ogEst(sqlite3Ato
cea0: 69 28 7a 2b 33 29 29 3b 0a 20 20 20 20 20 20 7d  i(z+3));.      }
ceb0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
cec0: 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 73 6b 69 70  _strglob("noskip
ced0: 73 63 61 6e 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  scan*", z)==0 ){
cee0: 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
cef0: 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20 31 3b  >noSkipScan = 1;
cf00: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
cf10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
cf20: 53 54 4d 55 4c 54 0a 20 20 20 20 20 20 65 6c 73  STMULT.      els
cf30: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
cf40: 72 67 6c 6f 62 28 22 63 6f 73 74 6d 75 6c 74 3d  rglob("costmult=
cf50: 5b 30 2d 39 5d 2a 22 2c 7a 29 3d 3d 30 20 29 7b  [0-9]*",z)==0 ){
cf60: 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
cf70: 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
cf80: 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
cf90: 74 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 2b  t(sqlite3Atoi(z+
cfa0: 39 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  9));.      }.#en
cfb0: 64 69 66 0a 20 20 20 20 20 20 77 68 69 6c 65 28  dif.      while(
cfc0: 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d   z[0]!=0 && z[0]
cfd0: 21 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  !=' ' ) z++;.   
cfe0: 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d     while( z[0]==
cff0: 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  ' ' ) z++;.    }
d000: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
d010: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  is callback is i
d020: 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
d030: 65 61 63 68 20 69 6e 64 65 78 20 77 68 65 6e 20  each index when 
d040: 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73  reading the.** s
d050: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
d060: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61  e.  .**.**     a
d070: 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[0] = name of
d080: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
d090: 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65    argv[1] = name
d0a0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 28 6d   of the index (m
d0b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ight be NULL).**
d0c0: 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 72       argv[2] = r
d0d0: 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73  esults of analys
d0e0: 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20  is - on integer 
d0f0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
d100: 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f  **.** Entries fo
d110: 72 20 77 68 69 63 68 20 61 72 67 76 5b 31 5d 3d  r which argv[1]=
d120: 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63  =NULL simply rec
d130: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
d140: 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65  f rows in.** the
d150: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
d160: 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f  c int analysisLo
d170: 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  ader(void *pData
d180: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
d190: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
d1a0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c  NotUsed){.  anal
d1b0: 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  ysisInfo *pInfo 
d1c0: 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a  = (analysisInfo*
d1d0: 29 70 44 61 74 61 3b 0a 20 20 49 6e 64 65 78 20  )pData;.  Index 
d1e0: 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65  *pIndex;.  Table
d1f0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *pTable;.  cons
d200: 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73  t char *z;..  as
d210: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
d220: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d230: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61 72  TER2(NotUsed, ar
d240: 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 76  gc);..  if( argv
d250: 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d  ==0 || argv[0]==
d260: 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20  0 || argv[2]==0 
d270: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d280: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
d290: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
d2a0: 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76  (pInfo->db, argv
d2b0: 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74  [0], pInfo->zDat
d2c0: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 54  abase);.  if( pT
d2d0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  able==0 ){.    r
d2e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
d2f0: 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b  f( argv[1]==0 ){
d300: 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
d310: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
d320: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 72 67  ite3_stricmp(arg
d330: 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d 30  v[0],argv[1])==0
d340: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d   ){.    pIndex =
d350: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
d360: 65 79 49 6e 64 65 78 28 70 54 61 62 6c 65 29 3b  eyIndex(pTable);
d370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
d380: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
d390: 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64  ndIndex(pInfo->d
d3a0: 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66  b, argv[1], pInf
d3b0: 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  o->zDatabase);. 
d3c0: 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 32 5d   }.  z = argv[2]
d3d0: 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  ;..  if( pIndex 
d3e0: 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a  ){.    tRowcnt *
d3f0: 61 69 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20  aiRowEst = 0;.  
d400: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 6e    int nCol = pIn
d410: 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b 0a  dex->nKeyCol+1;.
d420: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d430: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d440: 41 54 34 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78  AT4.    /* Index
d450: 2e 61 69 52 6f 77 45 73 74 20 6d 61 79 20 61 6c  .aiRowEst may al
d460: 72 65 61 64 79 20 62 65 20 73 65 74 20 68 65 72  ready be set her
d470: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  e if there are d
d480: 75 70 6c 69 63 61 74 65 20 0a 20 20 20 20 2a 2a  uplicate .    **
d490: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 65 6e   sqlite_stat1 en
d4a0: 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20 69  tries for this i
d4b0: 6e 64 65 78 2e 20 49 6e 20 74 68 61 74 20 63 61  ndex. In that ca
d4c0: 73 65 20 6a 75 73 74 20 63 6c 6f 62 62 65 72 0a  se just clobber.
d4d0: 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64      ** the old d
d4e0: 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
d4f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f   instead of allo
d500: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 61 72 72  cating a new arr
d510: 61 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ay.  */.    if( 
d520: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
d530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
d540: 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
d550: 28 74 52 6f 77 63 6e 74 2a 29 73 71 6c 69 74 65  (tRowcnt*)sqlite
d560: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
d570: 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43  of(tRowcnt) * nC
d580: 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ol);.      if( p
d590: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3d  Index->aiRowEst=
d5a0: 3d 30 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46  =0 ) sqlite3OomF
d5b0: 61 75 6c 74 28 70 49 6e 66 6f 2d 3e 64 62 29 3b  ault(pInfo->db);
d5c0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 69 52 6f 77  .    }.    aiRow
d5d0: 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  Est = pIndex->ai
d5e0: 52 6f 77 45 73 74 3b 0a 23 65 6e 64 69 66 0a 20  RowEst;.#endif. 
d5f0: 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72     pIndex->bUnor
d600: 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  dered = 0;.    d
d610: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
d620: 68 61 72 2a 29 7a 2c 20 6e 43 6f 6c 2c 20 61 69  har*)z, nCol, ai
d630: 52 6f 77 45 73 74 2c 20 70 49 6e 64 65 78 2d 3e  RowEst, pIndex->
d640: 61 69 52 6f 77 4c 6f 67 45 73 74 2c 20 70 49 6e  aiRowLogEst, pIn
d650: 64 65 78 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  dex);.    pIndex
d660: 2d 3e 68 61 73 53 74 61 74 31 20 3d 20 31 3b 0a  ->hasStat1 = 1;.
d670: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
d680: 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
d690: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ){.      pTable
d6a0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
d6b0: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
d6c0: 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 70 54 61  st[0];.      pTa
d6d0: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  ble->tabFlags |=
d6e0: 20 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20   TF_HasStat1;.  
d6f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d700: 20 49 6e 64 65 78 20 66 61 6b 65 49 64 78 3b 0a   Index fakeIdx;.
d710: 20 20 20 20 66 61 6b 65 49 64 78 2e 73 7a 49 64      fakeIdx.szId
d720: 78 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 73  xRow = pTable->s
d730: 7a 54 61 62 52 6f 77 3b 0a 23 69 66 64 65 66 20  zTabRow;.#ifdef 
d740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
d750: 53 54 4d 55 4c 54 0a 20 20 20 20 66 61 6b 65 49  STMULT.    fakeI
d760: 64 78 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  dx.pTable = pTab
d770: 6c 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  le;.#endif.    d
d780: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
d790: 68 61 72 2a 29 7a 2c 20 31 2c 20 30 2c 20 26 70  har*)z, 1, 0, &p
d7a0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
d7b0: 74 2c 20 26 66 61 6b 65 49 64 78 29 3b 0a 20 20  t, &fakeIdx);.  
d7c0: 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52    pTable->szTabR
d7d0: 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e 73 7a 49  ow = fakeIdx.szI
d7e0: 64 78 52 6f 77 3b 0a 20 20 20 20 70 54 61 62 6c  dxRow;.    pTabl
d7f0: 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  e->tabFlags |= T
d800: 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20 7d 0a  F_HasStat1;.  }.
d810: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d820: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 6e 64  /*.** If the Ind
d830: 65 78 2e 61 53 61 6d 70 6c 65 20 76 61 72 69 61  ex.aSample varia
d840: 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ble is not NULL,
d850: 20 64 65 6c 65 74 65 20 74 68 65 20 61 53 61 6d   delete the aSam
d860: 70 6c 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  ple[] array.** a
d870: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
d880: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d890: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
d8a0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
d8b0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 23 69  Index *pIdx){.#i
d8c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d8d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d8e0: 34 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53  4.  if( pIdx->aS
d8f0: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  ample ){.    int
d900: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   j;.    for(j=0;
d910: 20 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   j<pIdx->nSample
d920: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e  ; j++){.      In
d930: 64 65 78 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26  dexSample *p = &
d940: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d  pIdx->aSample[j]
d950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
d960: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b  bFree(db, p->p);
d970: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d980: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
d990: 78 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d  x->aSample);.  }
d9a0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 64 62 2d  .  if( db && db-
d9b0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
d9c0: 20 29 7b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53   ){.    pIdx->nS
d9d0: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  ample = 0;.    p
d9e0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30  Idx->aSample = 0
d9f0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  ;.  }.#else.  UN
da00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
da10: 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
da20: 41 4d 45 54 45 52 28 70 49 64 78 29 3b 0a 23 65  AMETER(pIdx);.#e
da30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
da40: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
da50: 54 41 54 34 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65  TAT4 */.}..#ifde
da60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
da70: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
da80: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
da90: 65 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 5d  e pIdx->aAvgEq[]
daa0: 20 61 72 72 61 79 20 62 61 73 65 64 20 6f 6e 20   array based on 
dab0: 74 68 65 20 73 61 6d 70 6c 65 73 20 63 75 72 72  the samples curr
dac0: 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20  ently.** stored 
dad0: 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  in pIdx->aSample
dae0: 5b 5d 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  []. .*/.static v
daf0: 6f 69 64 20 69 6e 69 74 41 76 67 45 71 28 49 6e  oid initAvgEq(In
db00: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66  dex *pIdx){.  if
db10: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 49 6e  ( pIdx ){.    In
db20: 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
db30: 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
db40: 6c 65 3b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d  le;.    IndexSam
db50: 70 6c 65 20 2a 70 46 69 6e 61 6c 20 3d 20 26 61  ple *pFinal = &a
db60: 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61  Sample[pIdx->nSa
db70: 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 69 6e 74  mple-1];.    int
db80: 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 6e   iCol;.    int n
db90: 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Col = 1;.    if(
dba0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f   pIdx->nSampleCo
dbb0: 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  l>1 ){.      /* 
dbc0: 49 66 20 74 68 69 73 20 69 73 20 73 74 61 74 34  If this is stat4
dbd0: 20 64 61 74 61 2c 20 74 68 65 6e 20 63 61 6c 63   data, then calc
dbe0: 75 6c 61 74 65 20 61 41 76 67 45 71 5b 5d 20 76  ulate aAvgEq[] v
dbf0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 0a 20 20  alues for all.  
dc00: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 63 6f      ** sample co
dc10: 6c 75 6d 6e 73 20 65 78 63 65 70 74 20 74 68 65  lumns except the
dc20: 20 6c 61 73 74 2e 20 54 68 65 20 6c 61 73 74 20   last. The last 
dc30: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
dc40: 20 31 2c 20 61 73 0a 20 20 20 20 20 20 2a 2a 20   1, as.      ** 
dc50: 6f 6e 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  once the trailin
dc60: 67 20 50 4b 20 66 69 65 6c 64 73 20 61 72 65 20  g PK fields are 
dc70: 63 6f 6e 73 69 64 65 72 65 64 20 61 6c 6c 20 69  considered all i
dc80: 6e 64 65 78 20 6b 65 79 73 20 61 72 65 0a 20 20  ndex keys are.  
dc90: 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 2e 20 20      ** unique.  
dca0: 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  */.      nCol = 
dcb0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
dcc0: 2d 31 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  -1;.      pIdx->
dcd0: 61 41 76 67 45 71 5b 6e 43 6f 6c 5d 20 3d 20 31  aAvgEq[nCol] = 1
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
dcf0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f  iCol=0; iCol<nCo
dd00: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
dd10: 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 20 3d 20    int nSample = 
dd20: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20  pIdx->nSample;. 
dd30: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd50: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
dd60: 65 20 74 68 72 6f 75 67 68 20 73 61 6d 70 6c 65  e through sample
dd70: 73 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  s */.      tRowc
dd80: 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b 20 20 20  nt sumEq = 0;   
dd90: 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74       /* Sum of t
dda0: 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 2a 2f  he nEq values */
ddb0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
ddc0: 76 67 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  vgEq = 0;.      
ddd0: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20  tRowcnt nRow;   
dde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ddf0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 69  ber of rows in i
de00: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 36  ndex */.      i6
de10: 34 20 6e 53 75 6d 31 30 30 20 3d 20 30 3b 20 20  4 nSum100 = 0;  
de20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
de30: 72 20 6f 66 20 74 65 72 6d 73 20 63 6f 6e 74 72  r of terms contr
de40: 69 62 75 74 69 6e 67 20 74 6f 20 73 75 6d 45 71  ibuting to sumEq
de50: 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 6e 44   */.      i64 nD
de60: 69 73 74 31 30 30 3b 20 20 20 20 20 20 20 20 20  ist100;         
de70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
de80: 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73   distinct values
de90: 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   in index */..  
dea0: 20 20 20 20 69 66 28 20 21 70 49 64 78 2d 3e 61      if( !pIdx->a
deb0: 69 52 6f 77 45 73 74 20 7c 7c 20 69 43 6f 6c 3e  iRowEst || iCol>
dec0: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 7c  =pIdx->nKeyCol |
ded0: 7c 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  | pIdx->aiRowEst
dee0: 5b 69 43 6f 6c 2b 31 5d 3d 3d 30 20 29 7b 0a 20  [iCol+1]==0 ){. 
def0: 20 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 70 46         nRow = pF
df00: 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69 43 6f 6c 5d  inal->anLt[iCol]
df10: 3b 0a 20 20 20 20 20 20 20 20 6e 44 69 73 74 31  ;.        nDist1
df20: 30 30 20 3d 20 28 69 36 34 29 31 30 30 20 2a 20  00 = (i64)100 * 
df30: 70 46 69 6e 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43  pFinal->anDLt[iC
df40: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e 53 61  ol];.        nSa
df50: 6d 70 6c 65 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  mple--;.      }e
df60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f  lse{.        nRo
df70: 77 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  w = pIdx->aiRowE
df80: 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 6e  st[0];.        n
df90: 44 69 73 74 31 30 30 20 3d 20 28 28 69 36 34 29  Dist100 = ((i64)
dfa0: 31 30 30 20 2a 20 70 49 64 78 2d 3e 61 69 52 6f  100 * pIdx->aiRo
dfb0: 77 45 73 74 5b 30 5d 29 20 2f 20 70 49 64 78 2d  wEst[0]) / pIdx-
dfc0: 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31  >aiRowEst[iCol+1
dfd0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
dfe0: 20 70 49 64 78 2d 3e 6e 52 6f 77 45 73 74 30 20   pIdx->nRowEst0 
dff0: 3d 20 6e 52 6f 77 3b 0a 0a 20 20 20 20 20 20 2f  = nRow;..      /
e000: 2a 20 53 65 74 20 6e 53 75 6d 20 74 6f 20 74 68  * Set nSum to th
e010: 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 73 74  e number of dist
e020: 69 6e 63 74 20 28 69 43 6f 6c 2b 31 29 20 66 69  inct (iCol+1) fi
e030: 65 6c 64 20 70 72 65 66 69 78 65 73 20 74 68 61  eld prefixes tha
e040: 74 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72  t.      ** occur
e050: 20 69 6e 20 74 68 65 20 73 74 61 74 34 20 74 61   in the stat4 ta
e060: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ble for this ind
e070: 65 78 2e 20 53 65 74 20 73 75 6d 45 71 20 74 6f  ex. Set sumEq to
e080: 20 74 68 65 20 73 75 6d 20 6f 66 20 0a 20 20 20   the sum of .   
e090: 20 20 20 2a 2a 20 74 68 65 20 6e 45 71 20 76 61     ** the nEq va
e0a0: 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  lues for column 
e0b0: 69 43 6f 6c 20 66 6f 72 20 74 68 65 20 73 61 6d  iCol for the sam
e0c0: 65 20 73 65 74 20 28 61 64 64 69 6e 67 20 74 68  e set (adding th
e0d0: 65 20 76 61 6c 75 65 20 0a 20 20 20 20 20 20 2a  e value .      *
e0e0: 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 77 68 65 72  * only once wher
e0f0: 65 20 74 68 65 72 65 20 65 78 69 73 74 20 64 75  e there exist du
e100: 70 6c 69 63 61 74 65 20 70 72 65 66 69 78 65 73  plicate prefixes
e110: 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ).  */.      for
e120: 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b  (i=0; i<nSample;
e130: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
e140: 66 28 20 69 3d 3d 28 70 49 64 78 2d 3e 6e 53 61  f( i==(pIdx->nSa
e150: 6d 70 6c 65 2d 31 29 0a 20 20 20 20 20 20 20 20  mple-1).        
e160: 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61   || aSample[i].a
e170: 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d 61 53 61 6d  nDLt[iCol]!=aSam
e180: 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44 4c 74 5b 69  ple[i+1].anDLt[i
e190: 43 6f 6c 5d 20 0a 20 20 20 20 20 20 20 20 29 7b  Col] .        ){
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 73 75 6d 45 71  .          sumEq
e1b0: 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61   += aSample[i].a
e1c0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nEq[iCol];.     
e1d0: 20 20 20 20 20 6e 53 75 6d 31 30 30 20 2b 3d 20       nSum100 += 
e1e0: 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  100;.        }. 
e1f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
e200: 28 20 6e 44 69 73 74 31 30 30 3e 6e 53 75 6d 31  ( nDist100>nSum1
e210: 30 30 20 26 26 20 73 75 6d 45 71 3c 6e 52 6f 77  00 && sumEq<nRow
e220: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 76 67 45   ){.        avgE
e230: 71 20 3d 20 28 28 69 36 34 29 31 30 30 20 2a 20  q = ((i64)100 * 
e240: 28 6e 52 6f 77 20 2d 20 73 75 6d 45 71 29 29 2f  (nRow - sumEq))/
e250: 28 6e 44 69 73 74 31 30 30 20 2d 20 6e 53 75 6d  (nDist100 - nSum
e260: 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  100);.      }.  
e270: 20 20 20 20 69 66 28 20 61 76 67 45 71 3d 3d 30      if( avgEq==0
e280: 20 29 20 61 76 67 45 71 20 3d 20 31 3b 0a 20 20   ) avgEq = 1;.  
e290: 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71      pIdx->aAvgEq
e2a0: 5b 69 43 6f 6c 5d 20 3d 20 61 76 67 45 71 3b 0a  [iCol] = avgEq;.
e2b0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e2c0: 2a 2a 20 4c 6f 6f 6b 20 75 70 20 61 6e 20 69 6e  ** Look up an in
e2d0: 64 65 78 20 62 79 20 6e 61 6d 65 2e 20 20 4f 72  dex by name.  Or
e2e0: 2c 20 69 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  , if the name of
e2f0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
e300: 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 73 75 70   table.** is sup
e310: 70 6c 69 65 64 20 69 6e 73 74 65 61 64 2c 20 66  plied instead, f
e320: 69 6e 64 20 74 68 65 20 50 52 49 4d 41 52 59 20  ind the PRIMARY 
e330: 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 74 68  KEY index for th
e340: 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  at table..*/.sta
e350: 74 69 63 20 49 6e 64 65 78 20 2a 66 69 6e 64 49  tic Index *findI
e360: 6e 64 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79  ndexOrPrimaryKey
e370: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e390: 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Name,.  const ch
e3a0: 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 49 6e 64  ar *zDb.){.  Ind
e3b0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
e3c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
e3d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 69  zName, zDb);.  i
e3e0: 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
e3f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
e400: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
e410: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
e420: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  ;.    if( pTab &
e430: 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  & !HasRowid(pTab
e440: 29 20 29 20 70 49 64 78 20 3d 20 73 71 6c 69 74  ) ) pIdx = sqlit
e450: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
e460: 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72  x(pTab);.  }.  r
e470: 65 74 75 72 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f  eturn pIdx;.}../
e480: 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f  *.** Load the co
e490: 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69 74 68 65  ntent from eithe
e4a0: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  r the sqlite_sta
e4b0: 74 34 20 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t4 or sqlite_sta
e4c0: 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 74  t3 table .** int
e4d0: 6f 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 49  o the relevant I
e4e0: 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61  ndex.aSample[] a
e4f0: 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  rrays..**.** Arg
e500: 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20 61 6e 64  uments zSql1 and
e510: 20 7a 53 71 6c 32 20 6d 75 73 74 20 70 6f 69 6e   zSql2 must poin
e520: 74 20 74 6f 20 53 51 4c 20 73 74 61 74 65 6d 65  t to SQL stateme
e530: 6e 74 73 20 74 68 61 74 20 72 65 74 75 72 6e 0a  nts that return.
e540: 2a 2a 20 64 61 74 61 20 65 71 75 69 76 61 6c 65  ** data equivale
e550: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
e560: 69 6e 67 20 28 73 74 61 74 65 6d 65 6e 74 73 20  ing (statements 
e570: 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
e580: 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73 65 65 20  r stat3,.** see 
e590: 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
e5a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  is function for 
e5b0: 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20  details):.**.** 
e5c0: 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c 45 43 54     zSql1: SELECT
e5d0: 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52   idx,count(*) 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 20 47 52 4f 55 50 20 42 59 20 69 64 78 0a  t4 GROUP BY idx.
e600: 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20 53 45 4c  **    zSql2: SEL
e610: 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c  ECT idx,neq,nlt,
e620: 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d  ndlt,sample FROM
e630: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
e640: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 25 51 20  .**.** where %Q 
e650: 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  is replaced with
e660: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
e670: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 53 51  me before the SQ
e680: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a  L is executed..*
e690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61  /.static int loa
e6a0: 64 53 74 61 74 54 62 6c 28 0a 20 20 73 71 6c 69  dStatTbl(.  sqli
e6b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
e6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e6d0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e6e0: 20 20 69 6e 74 20 62 53 74 61 74 33 2c 20 20 20    int bStat3,   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e 67 6c 65  /* Assume single
e710: 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 73 20   column records 
e720: 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  only */.  const 
e730: 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20 20 20 20  char *zSql1,    
e740: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
e750: 74 61 74 65 6d 65 6e 74 20 31 20 28 73 65 65 20  tatement 1 (see 
e760: 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73  above) */.  cons
e770: 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 2c 20 20  t char *zSql2,  
e780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
e790: 20 73 74 61 74 65 6d 65 6e 74 20 32 20 28 73 65   statement 2 (se
e7a0: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f  e above) */.  co
e7b0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 20 20  nst char *zDb   
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e7d0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 2e  atabase name (e.
e7e0: 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b  g. "main") */.){
e7f0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 73   /* Result codes
e820: 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
e830: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
e840: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20  tmt *pStmt = 0; 
e850: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
e860: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
e870: 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  un */.  char *zS
e880: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
e890: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
e8a0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
e8b0: 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  nt */.  Index *p
e8c0: 50 72 65 76 49 64 78 20 3d 20 30 3b 20 20 20 20  PrevIdx = 0;    
e8d0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
e8e0: 73 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c  s index in the l
e8f0: 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65 78 53 61  oop */.  IndexSa
e900: 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 20 20  mple *pSample;  
e910: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74         /* A slot
e920: 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c   in pIdx->aSampl
e930: 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  e[] */..  assert
e940: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
e950: 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 7a 53  bDisable );.  zS
e960: 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
e970: 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31 2c 20 7a  ntf(db, zSql1, z
e980: 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c  Db);.  if( !zSql
e990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e9a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e9b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e9c0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
e9d0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
e9e0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
e9f0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
ea00: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ea10: 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
ea20: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
ea30: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
ea40: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64  W ){.    int nId
ea50: 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  xCol = 1;       
ea60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ea70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73   of columns in s
ea80: 74 61 74 34 20 72 65 63 6f 72 64 73 20 2a 2f 0a  tat4 records */.
ea90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
eaa0: 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 61  x;   /* Index na
eab0: 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  me */.    Index 
eac0: 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20 50 6f 69  *pIdx;    /* Poi
ead0: 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65  nter to the inde
eae0: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  x object */.    
eaf0: 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20 20 20 20  int nSample;    
eb00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 61 6d  /* Number of sam
eb10: 70 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ples */.    int 
eb20: 6e 42 79 74 65 3b 20 20 20 20 20 20 2f 2a 20 42  nByte;      /* B
eb30: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 72 65  ytes of space re
eb40: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e  quired */.    in
eb50: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
eb60: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
eb70: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
eb80: 74 52 6f 77 63 6e 74 20 2a 70 53 70 61 63 65 3b  tRowcnt *pSpace;
eb90: 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28  ..    zIndex = (
eba0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
ebb0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
ebc0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49  , 0);.    if( zI
ebd0: 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ndex==0 ) contin
ebe0: 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70 6c 65 20  ue;.    nSample 
ebf0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
ec00: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  _int(pStmt, 1);.
ec10: 20 20 20 20 70 49 64 78 20 3d 20 66 69 6e 64 49      pIdx = findI
ec20: 6e 64 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79  ndexOrPrimaryKey
ec30: 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62  (db, zIndex, zDb
ec40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ec50: 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74 61 74 33  Idx==0 || bStat3
ec60: 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   || pIdx->nSampl
ec70: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 49  e==0 );.    /* I
ec80: 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20 69 73 20  ndex.nSample is 
ec90: 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74 68 69 73  non-zero at this
eca0: 20 70 6f 69 6e 74 20 69 66 20 64 61 74 61 20 68   point if data h
ecb0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
ecc0: 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64 20 66 72      ** loaded fr
ecd0: 6f 6d 20 74 68 65 20 73 74 61 74 34 20 74 61 62  om the stat4 tab
ece0: 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
ecf0: 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20 64 61   ignore stat3 da
ed00: 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ta.  */.    if( 
ed10: 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d  pIdx==0 || pIdx-
ed20: 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69  >nSample ) conti
ed30: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62 53 74  nue;.    if( bSt
ed40: 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  at3==0 ){.      
ed50: 61 73 73 65 72 74 28 20 21 48 61 73 52 6f 77 69  assert( !HasRowi
ed60: 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20  d(pIdx->pTable) 
ed70: 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  || pIdx->nColumn
ed80: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  ==pIdx->nKeyCol+
ed90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
eda0: 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
edb0: 54 61 62 6c 65 29 20 26 26 20 49 73 50 72 69 6d  Table) && IsPrim
edc0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
edd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 49 64  ) ){.        nId
ede0: 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  xCol = pIdx->nKe
edf0: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  yCol;.      }els
ee00: 65 7b 0a 20 20 20 20 20 20 20 20 6e 49 64 78 43  e{.        nIdxC
ee10: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
ee20: 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  mn;.      }.    
ee30: 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d  }.    pIdx->nSam
ee40: 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78 43 6f 6c  pleCol = nIdxCol
ee50: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
ee60: 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d 70 6c 65  zeof(IndexSample
ee70: 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  ) * nSample;.   
ee80: 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66   nByte += sizeof
ee90: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 49 64 78  (tRowcnt) * nIdx
eea0: 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61 6d 70 6c  Col * 3 * nSampl
eeb0: 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  e;.    nByte += 
eec0: 6e 49 64 78 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  nIdxCol * sizeof
eed0: 28 74 52 6f 77 63 6e 74 29 3b 20 20 20 20 20 2f  (tRowcnt);     /
eee0: 2a 20 53 70 61 63 65 20 66 6f 72 20 49 6e 64 65  * Space for Inde
eef0: 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f 0a 0a 20  x.aAvgEq[] */.. 
ef00: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
ef10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ef20: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
ef30: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
ef40: 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20  >aSample==0 ){. 
ef50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
ef60: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
ef70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ef80: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
ef90: 20 20 7d 0a 20 20 20 20 70 53 70 61 63 65 20 3d    }.    pSpace =
efa0: 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 49 64 78   (tRowcnt*)&pIdx
efb0: 2d 3e 61 53 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c  ->aSample[nSampl
efc0: 65 5d 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 41  e];.    pIdx->aA
efd0: 76 67 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70  vgEq = pSpace; p
efe0: 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c  Space += nIdxCol
eff0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f000: 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  <nSample; i++){.
f010: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d        pIdx->aSam
f020: 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d 20 70 53  ple[i].anEq = pS
f030: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
f040: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70  nIdxCol;.      p
f050: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  Idx->aSample[i].
f060: 61 6e 4c 74 20 3d 20 70 53 70 61 63 65 3b 20 70  anLt = pSpace; p
f070: 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c  Space += nIdxCol
f080: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53  ;.      pIdx->aS
f090: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d  ample[i].anDLt =
f0a0: 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20   pSpace; pSpace 
f0b0: 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20  += nIdxCol;.    
f0c0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  }.    assert( ((
f0d0: 75 38 2a 29 70 53 70 61 63 65 29 2d 6e 42 79 74  u8*)pSpace)-nByt
f0e0: 65 3d 3d 28 75 38 2a 29 28 70 49 64 78 2d 3e 61  e==(u8*)(pIdx->a
f0f0: 53 61 6d 70 6c 65 29 20 29 3b 0a 20 20 7d 0a 20  Sample) );.  }. 
f100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
f110: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
f120: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
f130: 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
f140: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
f150: 2c 20 7a 53 71 6c 32 2c 20 7a 44 62 29 3b 0a 20  , zSql2, zDb);. 
f160: 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
f170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f180: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
f190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
f1a0: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
f1b0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
f1c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f1d0: 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66  (db, zSql);.  if
f1e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
f1f0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  ;..  while( sqli
f200: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
f210: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
f220: 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b     char *zIndex;
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a   /* Index name *
f250: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
f260: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f280: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65  o the index obje
f290: 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ct */.    int nC
f2a0: 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ol = 1;         
f2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f2c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
f2d0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 7a 49  index */..    zI
f2e0: 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73  ndex = (char *)s
f2f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
f300: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
f310: 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20    if( zIndex==0 
f320: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f330: 70 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65 78  pIdx = findIndex
f340: 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62 2c  OrPrimaryKey(db,
f350: 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20   zIndex, zDb);. 
f360: 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
f370: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f   continue;.    /
f380: 2a 20 54 68 69 73 20 6e 65 78 74 20 63 6f 6e 64  * This next cond
f390: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
f3a0: 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64   data has alread
f3b0: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  y been loaded fr
f3c0: 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  om .    ** the s
f3d0: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
f3e0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
f3f0: 69 67 6e 6f 72 65 20 73 74 61 74 33 20 64 61 74  ignore stat3 dat
f400: 61 2e 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20  a.  */.    nCol 
f410: 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  = pIdx->nSampleC
f420: 6f 6c 3b 0a 20 20 20 20 69 66 28 20 62 53 74 61  ol;.    if( bSta
f430: 74 33 20 26 26 20 6e 43 6f 6c 3e 31 20 29 20 63  t3 && nCol>1 ) c
f440: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f450: 20 70 49 64 78 21 3d 70 50 72 65 76 49 64 78 20   pIdx!=pPrevIdx 
f460: 29 7b 0a 20 20 20 20 20 20 69 6e 69 74 41 76 67  ){.      initAvg
f470: 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20 20  Eq(pPrevIdx);.  
f480: 20 20 20 20 70 50 72 65 76 49 64 78 20 3d 20 70      pPrevIdx = p
f490: 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Idx;.    }.    p
f4a0: 53 61 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d 3e  Sample = &pIdx->
f4b0: 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53  aSample[pIdx->nS
f4c0: 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64 65 63 6f  ample];.    deco
f4d0: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
f4e0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
f4f0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29 2c 6e  _text(pStmt,1),n
f500: 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  Col,pSample->anE
f510: 71 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f  q,0,0);.    deco
f520: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
f530: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
f540: 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 6e  _text(pStmt,2),n
f550: 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c  Col,pSample->anL
f560: 74 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f  t,0,0);.    deco
f570: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
f580: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
f590: 5f 74 65 78 74 28 70 53 74 6d 74 2c 33 29 2c 6e  _text(pStmt,3),n
f5a0: 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 44  Col,pSample->anD
f5b0: 4c 74 2c 30 2c 30 29 3b 0a 0a 20 20 20 20 2f 2a  Lt,0,0);..    /*
f5c0: 20 54 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Take a copy of 
f5d0: 74 68 65 20 73 61 6d 70 6c 65 2e 20 41 64 64 20  the sample. Add 
f5e0: 74 77 6f 20 30 78 30 30 20 62 79 74 65 73 20 74  two 0x00 bytes t
f5f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
f600: 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68 69  ffer..    ** Thi
f610: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
f620: 20 73 61 6d 70 6c 65 20 72 65 63 6f 72 64 20 69   sample record i
f630: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 49 6e 20  s corrupted. In 
f640: 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 20  that case, the. 
f650: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
f660: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
f670: 20 6d 61 79 20 72 65 61 64 20 75 70 20 74 6f 20   may read up to 
f680: 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
f690: 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
f6a0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
f6b0: 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 69   buffer before i
f6c0: 74 20 72 65 61 6c 69 7a 65 73 20 69 74 20 69 73  t realizes it is
f6d0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
f6e0: 20 20 2a 2a 20 61 20 63 6f 72 72 75 70 74 20 72    ** a corrupt r
f6f0: 65 63 6f 72 64 2e 20 41 64 64 69 6e 67 20 74 68  ecord. Adding th
f700: 65 20 74 77 6f 20 30 78 30 30 20 62 79 74 65 73  e two 0x00 bytes
f710: 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
f720: 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20 20 20 20  rom causing.    
f730: 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
f740: 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20 20 70 53  read.  */.    pS
f750: 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71 6c 69 74  ample->n = sqlit
f760: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
f770: 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 70  pStmt, 4);.    p
f780: 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73 71 6c 69  Sample->p = sqli
f790: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f7a0: 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 2b  db, pSample->n +
f7b0: 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70 53 61   2);.    if( pSa
f7c0: 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20  mple->p==0 ){.  
f7d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
f7e0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
f7f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f800: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
f810: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 61 6d 70   }.    if( pSamp
f820: 6c 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 6d  le->n ){.      m
f830: 65 6d 63 70 79 28 70 53 61 6d 70 6c 65 2d 3e 70  emcpy(pSample->p
f840: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
f850: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c  _blob(pStmt, 4),
f860: 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20   pSample->n);.  
f870: 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53    }.    pIdx->nS
f880: 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72  ample++;.  }.  r
f890: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
f8a0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
f8b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f8c0: 20 29 20 69 6e 69 74 41 76 67 45 71 28 70 50 72   ) initAvgEq(pPr
f8d0: 65 76 49 64 78 29 3b 0a 20 20 72 65 74 75 72 6e  evIdx);.  return
f8e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
f8f0: 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
f900: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
f910: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
f920: 33 20 74 61 62 6c 65 73 20 69 6e 74 6f 20 0a 2a  3 tables into .*
f930: 2a 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d  * the Index.aSam
f940: 70 6c 65 5b 5d 20 61 72 72 61 79 73 20 6f 66 20  ple[] arrays of 
f950: 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  all indices..*/.
f960: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53  static int loadS
f970: 74 61 74 34 28 73 71 6c 69 74 65 33 20 2a 64 62  tat4(sqlite3 *db
f980: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
f990: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
f9a0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
f9b0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
f9c0: 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f  codes from subro
f9d0: 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20 61 73 73  utines */..  ass
f9e0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
f9f0: 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
fa00: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
fa10: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
fa20: 65 5f 73 74 61 74 34 22 2c 20 7a 44 62 29 20 29  e_stat4", zDb) )
fa30: 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53  {.    rc = loadS
fa40: 74 61 74 54 62 6c 28 64 62 2c 20 30 2c 0a 20 20  tatTbl(db, 0,.  
fa50: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c      "SELECT idx,
fa60: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51  count(*) FROM %Q
fa70: 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47 52  .sqlite_stat4 GR
fa80: 4f 55 50 20 42 59 20 69 64 78 22 2c 20 0a 20 20  OUP BY idx", .  
fa90: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c      "SELECT idx,
faa0: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d  neq,nlt,ndlt,sam
fab0: 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ple FROM %Q.sqli
fac0: 74 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20  te_stat4",.     
fad0: 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a   zDb.    );.  }.
fae0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
faf0: 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 46  E_OK && sqlite3F
fb00: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
fb10: 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 7a 44 62  lite_stat3", zDb
fb20: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  ) ){.    rc = lo
fb30: 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20 31 2c  adStatTbl(db, 1,
fb40: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fb50: 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  dx,count(*) FROM
fb60: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33   %Q.sqlite_stat3
fb70: 20 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20   GROUP BY idx", 
fb80: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fb90: 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c  dx,neq,nlt,ndlt,
fba0: 73 71 6c 69 74 65 5f 72 65 63 6f 72 64 28 73 61  sqlite_record(sa
fbb0: 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51 2e 73 71  mple) FROM %Q.sq
fbc0: 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 20  lite_stat3",.   
fbd0: 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20     zDb.    );.  
fbe0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
fbf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fc00: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
fc10: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
fc20: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ** Load the cont
fc30: 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ent of the sqlit
fc40: 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69  e_stat1 and sqli
fc50: 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62 6c 65  te_stat3/4 table
fc60: 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  s. The.** conten
fc70: 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ts of sqlite_sta
fc80: 74 31 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  t1 are used to p
fc90: 6f 70 75 6c 61 74 65 20 74 68 65 20 49 6e 64 65  opulate the Inde
fca0: 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a 2a 2a 20  x.aiRowEst[].** 
fcb0: 61 72 72 61 79 73 2e 20 54 68 65 20 63 6f 6e 74  arrays. The cont
fcc0: 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73  ents of sqlite_s
fcd0: 74 61 74 33 2f 34 20 61 72 65 20 75 73 65 64 20  tat3/4 are used 
fce0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  to populate the.
fcf0: 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65  ** Index.aSample
fd00: 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a  [] arrays..**.**
fd10: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   If the sqlite_s
fd20: 74 61 74 31 20 74 61 62 6c 65 20 69 73 20 6e 6f  tat1 table is no
fd30: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  t present in the
fd40: 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54   database, SQLIT
fd50: 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20 72 65  E_ERROR.** is re
fd60: 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
fd70: 63 61 73 65 2c 20 65 76 65 6e 20 69 66 20 53 51  case, even if SQ
fd80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
fd90: 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65 64 20  3/4 was defined 
fda0: 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70 69  .** during compi
fdb0: 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73  lation and the s
fdc0: 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61  qlite_stat3/4 ta
fdd0: 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ble is present, 
fde0: 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 72  no data is .** r
fdf0: 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a  ead from it..**.
fe00: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
fe10: 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20  BLE_STAT3/4 was 
fe20: 64 65 66 69 6e 65 64 20 64 75 72 69 6e 67 20 63  defined during c
fe30: 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74  ompilation and t
fe40: 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74  he .** sqlite_st
fe50: 61 74 34 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  at4 table is not
fe60: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
fe70: 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45  database, SQLITE
fe80: 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74  _ERROR is.** ret
fe90: 75 72 6e 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  urned. However, 
fea0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 61  in this case, da
feb0: 74 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  ta is read from 
fec0: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
fed0: 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 69 74  .** table (if it
fee0: 20 69 73 20 70 72 65 73 65 6e 74 29 20 62 65 66   is present) bef
fef0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
ff00: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
ff10: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
ff20: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
ff30: 73 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f  s sets db->mallo
ff40: 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73  cFailed..** This
ff50: 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 63 61   means if the ca
ff60: 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 61  ller does not ca
ff70: 72 65 20 61 62 6f 75 74 20 6f 74 68 65 72 20 65  re about other e
ff80: 72 72 6f 72 73 2c 20 74 68 65 20 72 65 74 75 72  rrors, the retur
ff90: 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20 62 65  n.** code may be
ffa0: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
ffb0: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73   sqlite3Analysis
ffc0: 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62  Load(sqlite3 *db
ffd0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e  , int iDb){.  an
ffe0: 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f  alysisInfo sInfo
fff0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  ;.  HashElem *i;
10000 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
10010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10020 5f 4f 4b 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70  _OK;.  Schema *p
10030 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
10040 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a  [iDb].pSchema;..
10050 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
10060 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
10070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
10080 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
10090 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20   );..  /* Clear 
100a0 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74 69 73  any prior statis
100b0 74 69 63 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  tics */.  assert
100c0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
100d0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
100e0 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  , 0) );.  for(i=
100f0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
10100 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
10110 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
10120 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
10130 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
10140 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
10150 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
10160 6c 61 67 73 20 26 3d 20 7e 54 46 5f 48 61 73 53  lags &= ~TF_HasS
10170 74 61 74 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  tat1;.  }.  for(
10180 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
10190 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
101a0 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
101b0 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
101c0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
101d0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
101e0 69 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 68 61  i);.    pIdx->ha
101f0 73 53 74 61 74 31 20 3d 20 30 3b 0a 23 69 66 64  sStat1 = 0;.#ifd
10200 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10210 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
10220 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
10230 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
10240 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70 49 64  , pIdx);.    pId
10250 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a  x->aSample = 0;.
10260 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
10270 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69 73   Load new statis
10280 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65 20  tics out of the 
10290 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
102a0 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62  le */.  sInfo.db
102b0 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a   = db;.  sInfo.z
102c0 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61  Database = db->a
102d0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
102e0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
102f0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
10300 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e  lite_stat1", sIn
10310 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 21 3d 30  fo.zDatabase)!=0
10320 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   ){.    zSql = s
10330 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10340 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
10350 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20  CT tbl,idx,stat 
10360 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
10370 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61  tat1", sInfo.zDa
10380 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
10390 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
103a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
103b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
103c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
103d0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
103e0 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c   zSql, analysisL
103f0 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30  oader, &sInfo, 0
10400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10410 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
10420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10430 2a 20 53 65 74 20 61 70 70 72 6f 70 72 69 61 74  * Set appropriat
10440 65 20 64 65 66 61 75 6c 74 73 20 6f 6e 20 61 6c  e defaults on al
10450 6c 20 69 6e 64 65 78 65 73 20 6e 6f 74 20 69 6e  l indexes not in
10460 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
10470 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 61 73 73  1 table */.  ass
10480 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10490 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
104a0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72  iDb, 0) );.  for
104b0 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
104c0 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
104d0 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
104e0 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
104f0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
10500 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
10510 28 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49  (i);.    if( !pI
10520 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 20 73  dx->hasStat1 ) s
10530 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
10540 45 73 74 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  Est(pIdx);.  }..
10550 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 74    /* Load the st
10560 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68  atistics from th
10570 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74  e sqlite_stat4 t
10580 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
10590 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
105a0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
105b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
105c0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
105d0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
105e0 54 45 5f 53 74 61 74 33 34 29 20 29 7b 0a 20 20  TE_Stat34) ){.  
105f0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
10600 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  bDisable++;.    
10610 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 34 28 64  rc = loadStat4(d
10620 62 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61  b, sInfo.zDataba
10630 73 65 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  se);.    db->loo
10640 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
10650 2d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73  -;.  }.  for(i=s
10660 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
10670 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
10680 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
10690 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
106a0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
106b0 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
106c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
106d0 65 28 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  e(pIdx->aiRowEst
106e0 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 69 52  );.    pIdx->aiR
106f0 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  owEst = 0;.  }.#
10700 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d  endif..  if( rc=
10710 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
10720 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
10730 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20  ault(db);.  }.  
10740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23  return rc;.}...#
10750 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10760 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a  OMIT_ANALYZE */.