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

Artifact c27da55795a11d09bea74259782c3e11e9750534:


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 30 20 61 6e 64 20 6c  ions 3.8.0 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 69 63 73 20 72 65  the statisics re
0730: 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74 68  quired.** for th
0740: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
0750: 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68 6f  to make good cho
0760: 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d  ices..**.** Form
0770: 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  at of sqlite_sta
0780: 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  t1:.**.** There 
0790: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65 20  is normally one 
07a0: 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20 77  row per index, w
07b0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69 64  ith the index id
07c0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 0a  entified by the.
07d0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 69  ** name in the i
07e0: 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  dx column.  The 
07f0: 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  tbl column is th
0800: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0810: 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68 20  ble to.** which 
0820: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0830: 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63 68  s.  In each such
0840: 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20 63   row, the stat c
0850: 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  olumn will be.**
0860: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73   a string consis
0870: 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20 6f  ting of a list o
0880: 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65  f integers.  The
0890: 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
08a0: 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20 69  n this.** list i
08b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
08c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
08d0: 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  x.  (This is the
08e0: 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20   same as the.** 
08f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0900: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78 63  n the table, exc
0910: 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c 20  ept for partial 
0920: 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20 73  indices.)  The s
0930: 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65 72  econd.** integer
0940: 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65 20   is the average 
0950: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0960: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
0970: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a 2a   have the same.*
0980: 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 66  * value in the f
0990: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
09a0: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74  he index.  The t
09b0: 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73 20  hird integer is 
09c0: 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20 6e  the average.** n
09d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
09e0: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
09f0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
0a00: 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  lue for the firs
0a10: 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  t two.** columns
0a20: 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74 65  .  The N-th inte
0a30: 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69 73  ger (for N>1) is
0a40: 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75 6d   the average num
0a50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
0a60: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68 69  ** the index whi
0a70: 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ch have the same
0a80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66   value for the f
0a90: 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e 73  irst N-1 columns
0aa0: 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63 6f  .  For.** a K-co
0ab0: 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65 72  lumn index, ther
0ac0: 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69 6e  e will be K+1 in
0ad0: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 74  tegers in the st
0ae0: 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a 2a  at column.  If.*
0af0: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75  * the index is u
0b00: 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65 20  nique, then the 
0b10: 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69 6c  last integer wil
0b20: 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  l be 1..**.** Th
0b30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  e list of intege
0b40: 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20 63  rs in the stat c
0b50: 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f 6e  olumn can option
0b60: 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65 64  ally be followed
0b70: 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77 6f  .** by the keywo
0b80: 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e 20  rd "unordered". 
0b90: 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22   The "unordered"
0ba0: 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74 20   keyword, if it 
0bb0: 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20 6d  is present,.** m
0bc0: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 64  ust be separated
0bd0: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 69   from the last i
0be0: 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e 67  nteger by a sing
0bf0: 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74 68  le space.  If th
0c00: 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64 22  e.** "unordered"
0c10: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0c20: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71 75  ent, then the qu
0c30: 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  ery planner assu
0c40: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
0c50: 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65 72  index is unorder
0c60: 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  ed and will not 
0c70: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66 6f  use the index fo
0c80: 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79 2e  r a range query.
0c90: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
0ca0: 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78 20  qlite_stat1.idx 
0cb0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c 20  column is NULL, 
0cc0: 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
0cd0: 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63 6f  stat1.stat.** co
0ce0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
0cf0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 77  single integer w
0d00: 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73 74  hich is the (est
0d10: 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20 6f  imated) number o
0d20: 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65  f.** rows in the
0d30: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
0d40: 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61 74  d by sqlite_stat
0d50: 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  1.tbl..**.** For
0d60: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0d70: 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  at2:.**.** The s
0d80: 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6f  qlite_stat2 is o
0d90: 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 20  nly created and 
0da0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
0db0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
0dc0: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
0dd0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 61  E_ENABLE_STAT2 a
0de0: 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  nd if the SQLite
0df0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
0e00: 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33 2e  is between.** 3.
0e10: 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e 20  6.18 and 3.7.8. 
0e20: 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61 62   The "stat2" tab
0e30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  le contains addi
0e40: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
0e50: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  on.** about the 
0e60: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 20  distribution of 
0e70: 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20 69  keys within an i
0e80: 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65 78  ndex.  The index
0e90: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
0ea0: 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20 63  y.** the "idx" c
0eb0: 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22 74  olumn and the "t
0ec0: 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  bl" column is th
0ed0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0ee0: 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a 20  ble to which.** 
0ef0: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0f00: 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75 73  s.  There are us
0f10: 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69 6e  ually 10 rows in
0f20: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0f30: 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 65  2.** table for e
0f40: 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ach index..**.**
0f50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0f60: 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6e  2 entries for an
0f70: 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76 65   index that have
0f80: 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65 65   sampleno betwee
0f90: 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e 63  n 0 and 9.** inc
0fa0: 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70 6c  lusive are sampl
0fb0: 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  es of the left-m
0fc0: 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69 6e  ost key value in
0fd0: 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65 6e   the index taken
0fe0: 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73 70   at.** evenly sp
0ff0: 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f 6e  aced points alon
1000: 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c 65  g the index.  Le
1010: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1020: 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a 20  samples be S.** 
1030: 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e 64  (10 in the stand
1040: 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20 6c  ard build) and l
1050: 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d 62  et C be the numb
1060: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1070: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 6e  e index..** Then
1080: 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f 77   the sampled row
1090: 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a 0a  s are given by:.
10a0: 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75 6d  **.**     rownum
10b0: 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20 43  ber = (i*C*2 + C
10c0: 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46 6f  )/(S*2).**.** Fo
10d0: 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61 6e  r i between 0 an
10e0: 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74 75  d S-1.  Conceptu
10f0: 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78 20  ally, the index 
1100: 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65 64  space is divided
1110: 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66 6f   into.** S unifo
1120: 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20 74  rm buckets and t
1130: 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20 74  he samples are t
1140: 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66 72  he middle row fr
1150: 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e 0a  om each bucket..
1160: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
1170: 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74   for sqlite_stat
1180: 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68 65  2 is recorded he
1190: 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72 65  re for legacy re
11a0: 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a 2a  ference.  This.*
11b0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  * version of SQL
11c0: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ite does not sup
11d0: 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61 74  port sqlite_stat
11e0: 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20 72  2.  It neither r
11f0: 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69 74  eads nor.** writ
1200: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  es the sqlite_st
1210: 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69 73  at2 table.  This
1220: 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69   version of SQLi
1230: 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  te only supports
1240: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33  .** sqlite_stat3
1250: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1260: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 3a  or sqlite_stat3:
1270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
1280: 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20 69  e_stat3 format i
1290: 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73 71  s a subset of sq
12a0: 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65 6e  lite_stat4.  Hen
12b0: 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ce, the.** sqlit
12c0: 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20 77  e_stat4 format w
12d0: 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65 64  ill be described
12e0: 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65 72   first.  Further
12f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1300: 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74 61  about sqlite_sta
1310: 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73  t3 follows the s
1320: 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73 63  qlite_stat4 desc
1330: 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ription..**.** F
1340: 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65  ormat for sqlite
1350: 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41 73  _stat4:.**.** As
1360: 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74 61   with sqlite_sta
1370: 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f 73  t2, the sqlite_s
1380: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1390: 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64 61  ins histogram da
13a0: 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68 65  ta.** to aid the
13b0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69   query planner i
13c0: 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64 20  n choosing good 
13d0: 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f 6e  indices based on
13e0: 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 74   the values.** t
13f0: 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  hat indexed colu
1400: 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  mns are compared
1410: 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65 20   against in the 
1420: 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f 66  WHERE clauses of
1430: 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  .** queries..**.
1440: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  ** The sqlite_st
1450: 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  at4 table contai
1460: 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74 72  ns multiple entr
1470: 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ies for each ind
1480: 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20 63  ex..** The idx c
1490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65 20  olumn names the 
14a0: 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74 62  index and the tb
14b0: 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  l column is the 
14c0: 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20  table of the.** 
14d0: 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 69  index.  If the i
14e0: 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75 6d  dx and tbl colum
14f0: 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2c  ns are the same,
1500: 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c 65   then the sample
1510: 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e   is.** of the IN
1520: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1530: 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20 63  Y.  The sample c
1540: 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62 20  olumn is a blob 
1550: 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20  which is the.** 
1560: 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67 20  binary encoding 
1570: 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  of a key from th
1580: 65 20 69 6e 64 65 78 2c 20 77 69 74 68 20 74 68  e index, with th
1590: 65 20 74 72 61 69 6c 69 6e 67 20 72 6f 77 69 64  e trailing rowid
15a0: 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 20 20 54 68  .** omitted.  Th
15b0: 65 20 6e 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20  e nEq column is 
15c0: 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  a list of intege
15d0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15e0: 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
15f0: 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d   approximate num
1600: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1610: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1620: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 0a 2a 2a 20  e left-most .** 
1630: 63 6f 6c 75 6d 6e 20 65 78 61 63 74 6c 79 20 6d  column exactly m
1640: 61 74 63 68 65 73 20 74 68 65 20 6c 65 66 74 2d  atches the left-
1650: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
1660: 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  he sample.  The 
1670: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
1680: 72 20 69 6e 20 6e 45 71 20 69 73 20 74 68 65 20  r in nEq is the 
1690: 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62  approximate numb
16a0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16b0: 20 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65   the index where
16c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
16d0: 6f 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  o columns match 
16e0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f  the first two co
16f0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  lumns of the sam
1700: 70 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  ple..** And so f
1710: 6f 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e  orth.  nLt is an
1720: 6f 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e  other list of in
1730: 74 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77  tegers that show
1740: 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
1750: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  .** number of en
1760: 74 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73  tries that are s
1770: 74 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61  trictly less tha
1780: 6e 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54  n the sample.  T
1790: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65  he first.** inte
17a0: 67 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61  ger in nLt conta
17b0: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
17c0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
17d0: 20 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65   index where the
17e0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
17f0: 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61  lumn is less tha
1800: 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
1810: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61  column of the sa
1820: 6d 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74  mple..** The K-t
1830: 68 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  h integer in the
1840: 20 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68   nLt entry is th
1850: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
1860: 78 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68  x entries .** wh
1870: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20  ere the first K 
1880: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73  columns are less
1890: 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
18a0: 4b 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  K columns of the
18b0: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65  .** sample.  The
18c0: 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20   nDLt column is 
18d0: 6c 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20  like nLt except 
18e0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
18f0: 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
1900: 6f 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72  of distinct entr
1910: 69 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ies in the index
1920: 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
1930: 68 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c  han the.** sampl
1940: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63  e..**.** There c
1950: 61 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61  an be an arbitra
1960: 72 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c  ry number of sql
1970: 69 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65  ite_stat4 entrie
1980: 73 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20  s per index..** 
1990: 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  The ANALYZE comm
19a0: 61 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c  and will typical
19b0: 6c 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69  ly generate sqli
19c0: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a  te_stat4 tables.
19d0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ** that contain 
19e0: 62 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34  between 10 and 4
19f0: 30 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20  0 samples which 
1a00: 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
1a10: 61 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65  across.** the ke
1a20: 79 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20  y space, though 
1a30: 6e 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61  not uniformly, a
1a40: 6e 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65  nd which include
1a50: 20 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a   samples with.**
1a60: 20 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65   large nEq value
1a70: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  s..**.** Format 
1a80: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1a90: 20 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68   redux:.**.** Th
1aa0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  e sqlite_stat3 t
1ab0: 61 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c  able is like sql
1ac0: 69 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74  ite_stat4 except
1ad0: 20 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a   that it only.**
1ae0: 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65   looks at the le
1af0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
1b00: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68  f the index.  Th
1b10: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73  e sqlite_stat3.s
1b20: 61 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ample.** column 
1b30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74  contains the act
1b40: 75 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ual value of the
1b50: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1b60: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
1b70: 61 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20  a blob encoding 
1b80: 6f 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  of the complete 
1b90: 69 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20  index key as is 
1ba0: 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69  found in.** sqli
1bb0: 74 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e  te_stat4.sample.
1bc0: 20 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20    The nEq, nLt, 
1bd0: 61 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73  and nDLt entries
1be0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
1bf0: 0a 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20  .** all contain 
1c00: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e  just a single in
1c10: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1c20: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66  he same as the f
1c30: 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20  irst.** integer 
1c40: 69 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  in the equivalen
1c50: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c  t columns in sql
1c60: 69 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69  ite_stat4..*/.#i
1c70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c80: 54 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75  T_ANALYZE.#inclu
1c90: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
1ca0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cc0: 34 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  4).# define IsSt
1cd0: 61 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69  at4     1.# defi
1ce0: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30  ne IsStat3     0
1cf0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1d10: 54 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53  T3).# define IsS
1d20: 74 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66  tat4     0.# def
1d30: 69 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20  ine IsStat3     
1d40: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1d50: 20 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23   IsStat4     0.#
1d60: 20 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20   define IsStat3 
1d70: 20 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51      0.# undef SQ
1d80: 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c  LITE_STAT4_SAMPL
1d90: 45 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  ES.# define SQLI
1da0: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
1db0: 20 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e   1.#endif.#defin
1dc0: 65 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49  e IsStat34    (I
1dd0: 73 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20  sStat3+IsStat4) 
1de0: 20 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20   /* 1 for STAT3 
1df0: 6f 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65  or STAT4. 0 othe
1e00: 72 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rwise */../*.** 
1e10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
1e20: 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1e30: 20 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74   opens the sqlit
1e40: 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a  e_statN tables..
1e50: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  ** The sqlite_st
1e60: 61 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77  at1 table is alw
1e70: 61 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73  ays relevant.  s
1e80: 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e  qlite_stat2 is n
1e90: 6f 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20  ow.** obsolete. 
1ea0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
1eb0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61  d sqlite_stat4 a
1ec0: 72 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77  re only opened w
1ed0: 68 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  hen.** appropria
1ee0: 74 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  te compile-time 
1ef0: 6f 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76  options are prov
1f00: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ided..**.** If t
1f10: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
1f20: 74 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72  tables do not pr
1f30: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20  eviously exist, 
1f40: 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
1f50: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57  *.** Argument zW
1f60: 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f  here may be a po
1f70: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1f80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  r containing a t
1f90: 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72  able name,.** or
1fa0: 20 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c   it may be a NUL
1fb0: 4c 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  L pointer. If it
1fc0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1fd0: 65 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  en all entries i
1fe0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
1ff0: 73 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73  statN tables ass
2000: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2010: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65   named table are
2020: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
2030: 7a 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20  zWhere==0, then 
2040: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
2050: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
2060: 73 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69  stat table entri
2070: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
2080: 69 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65  id openStatTable
2090: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20a0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20c0: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61  he database we a
20f0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f  re looking in */
2100: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c  .  int iStatCur,
2110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2120: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  en the sqlite_st
2130: 61 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69  at1 table on thi
2140: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2150: 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
2160: 2c 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ,     /* Delete 
2170: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73  entries for this
2180: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2190: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21a0: 2a 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20  *zWhereType  /* 
21b0: 45 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20  Either "tbl" or 
21c0: 22 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74  "idx" */.){.  st
21d0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
21e0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
21f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73  onst char *zCols
2210: 3b 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d  ;.  } aTable[] =
2220: 20 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65   {.    { "sqlite
2230: 5f 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64  _stat1", "tbl,id
2240: 78 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64  x,stat" },.#if d
2250: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2260: 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20  ABLE_STAT4).    
2270: 7b 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  { "sqlite_stat4"
2280: 2c 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e  , "tbl,idx,neq,n
2290: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20  lt,ndlt,sample" 
22a0: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
22b0: 5f 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65  _stat3", 0 },.#e
22c0: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
22d0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
22e0: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
22f0: 74 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat3", "tbl,idx,
2300: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d  neq,nlt,ndlt,sam
2310: 70 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73  ple" },.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20  qlite_stat4", 0 
2330: 7d 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22  },.#else.    { "
2340: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30  sqlite_stat3", 0
2350: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74   },.    { "sqlit
2360: 65 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23  e_stat4", 0 },.#
2370: 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74  endif.  };.  int
2380: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
2390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23a0: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62    Db *pDb;.  Vdb
23b0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
23c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
23d0: 20 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79   int aRoot[Array
23e0: 53 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20  Size(aTable)];. 
23f0: 20 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41   u8 aCreateTbl[A
2400: 72 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29  rraySize(aTable)
2410: 5d 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  ];..  if( v==0 )
2420: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
2430: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2440: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
2450: 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
2460: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
2470: 3d 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20  ==db );.  pDb = 
2480: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
2490: 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20    /* Create new 
24a0: 73 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73  statistic tables
24b0: 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
24c0: 65 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20  exist, or clear 
24d0: 74 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65  them.  ** if the
24e0: 79 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69  y do already exi
24f0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  st..  */.  for(i
2500: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2510: 61 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20  aTable); i++){. 
2520: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2530: 54 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e  Tab = aTable[i].
2540: 7a 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65  zName;.    Table
2550: 20 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28   *pStat;.    if(
2560: 20 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65   (pStat = sqlite
2570: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
2580: 54 61 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  Tab, pDb->zName)
2590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
25a0: 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c  ( aTable[i].zCol
25b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
25c0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  The sqlite_statN
25d0: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
25e0: 65 78 69 73 74 2e 20 43 72 65 61 74 65 20 69 74  exist. Create it
25f0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20  . Note that a . 
2600: 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65         ** side-e
2610: 66 66 65 63 74 20 6f 66 20 74 68 65 20 43 52 45  ffect of the CRE
2620: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2630: 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20  ent is to leave 
2640: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20  the rootpage .  
2650: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2660: 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67  new table in reg
2670: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
2680: 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69  gRoot. This is i
2690: 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20  mportant .      
26a0: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
26b0: 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64   OpenWrite opcod
26c0: 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20  e below will be 
26d0: 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20  needing it. */. 
26e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
26f0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
2700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
2710: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25  REATE TABLE %Q.%
2720: 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61  s(%s)", pDb->zNa
2730: 6d 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65  me, zTab, aTable
2740: 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20  [i].zCols.      
2750: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 52 6f    );.        aRo
2760: 6f 74 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  ot[i] = pParse->
2770: 72 65 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20  regRoot;.       
2780: 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d   aCreateTbl[i] =
2790: 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3b   OPFLAG_P2ISREG;
27a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
27b0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
27c0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
27d0: 78 69 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65  xists. If zWhere
27e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65   is not NULL, de
27f0: 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  lete all entries
2800: 20 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63   .      ** assoc
2810: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
2820: 61 62 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20  able zWhere. If 
2830: 7a 57 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20  zWhere is NULL, 
2840: 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2850: 20 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65   ** entire conte
2860: 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  nts of the table
2870: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74  . */.      aRoot
2880: 5b 69 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75  [i] = pStat->tnu
2890: 6d 3b 0a 20 20 20 20 20 20 61 43 72 65 61 74 65  m;.      aCreate
28a0: 54 62 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Tbl[i] = 0;.    
28b0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
28c0: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
28d0: 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54 61  aRoot[i], 1, zTa
28e0: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 57  b);.      if( zW
28f0: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  here ){.        
2900: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
2910: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
2920: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
2930: 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
2940: 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20  s=%Q",.         
2950: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54    pDb->zName, zT
2960: 61 62 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20  ab, zWhereType, 
2970: 7a 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 29  zWhere.        )
2980: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2990: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71         /* The sq
29a0: 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74  lite_stat[134] t
29b0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
29c0: 73 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c  sts.  Delete all
29d0: 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
29e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29f0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
2a00: 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b   aRoot[i], iDb);
2a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a20: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
2a30: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33  e sqlite_stat[13
2a40: 34 5d 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72  4] tables for wr
2a50: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28  iting. */.  for(
2a60: 69 3d 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  i=0; aTable[i].z
2a70: 43 6f 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cols; i++){.    
2a80: 61 73 73 65 72 74 28 20 69 3c 41 72 72 61 79 53  assert( i<ArrayS
2a90: 69 7a 65 28 61 54 61 62 6c 65 29 20 29 3b 0a 20  ize(aTable) );. 
2aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ab0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
2ac0: 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69  rite, iStatCur+i
2ad0: 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29  , aRoot[i], iDb)
2ae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2af0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
2b00: 20 28 63 68 61 72 20 2a 29 33 2c 20 50 34 5f 49   (char *)3, P4_I
2b10: 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  NT32);.    sqlit
2b20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2b30: 2c 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29  , aCreateTbl[i])
2b40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2b50: 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65  ecommended numbe
2b60: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72  r of samples for
2b70: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f   sqlite_stat4.*/
2b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b90: 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20  STAT4_SAMPLES.# 
2ba0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54  define SQLITE_ST
2bb0: 41 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23  AT4_SAMPLES 24.#
2bc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72  endif../*.** Thr
2bd0: 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ee SQL functions
2be0: 20 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20   - stat_init(), 
2bf0: 73 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64  stat_push(), and
2c00: 20 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a   stat_get() -.**
2c10: 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e   share an instan
2c20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f  ing structure to
2c40: 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74   hold their stat
2c50: 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  e.** information
2c60: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c70: 75 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53  uct Stat4Accum S
2c80: 74 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64  tat4Accum;.typed
2c90: 65 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53  ef struct Stat4S
2ca0: 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c  ample Stat4Sampl
2cb0: 65 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53  e;.struct Stat4S
2cc0: 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e  ample {.  tRowcn
2cd0: 74 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20  t *anEq;        
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2cf0: 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f  ite_stat4.nEq */
2d00: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c  .  tRowcnt *anDL
2d10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d20: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2d30: 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65  t4.nDLt */.#ifde
2d40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d50: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2d60: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20   tRowcnt *anLt; 
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2d90: 2e 6e 4c 74 20 2a 2f 0a 20 20 69 36 34 20 69 52  .nLt */.  i64 iR
2da0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2dc0: 69 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65  id in main table
2dd0: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
2de0: 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b 20 20   u8 isPSample;  
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 65   /* True if a pe
2e10: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a 2f  riodic sample */
2e20: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53 61 6d     /* If !isPSam
2e50: 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f 6e 20  ple, the reason 
2e60: 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a 2f  for inclusion */
2e70: 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20 20 20  .  u32 iHash;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b 65 72     /* Tiebreaker
2ea0: 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69 66 0a   hash */.#endif.
2eb0: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 0a 73 74 72 75 63 74 20 53 74        .struct St
2ef0: 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74 52 6f  at4Accum {.  tRo
2f00: 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20  wcnt nRow;      
2f10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f20: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2f30: 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
2f40: 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d 70    tRowcnt nPSamp
2f50: 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  le;         /* H
2f60: 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20 61  ow often to do a
2f70: 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65   periodic sample
2f80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2fb0: 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2b 20  umns in index + 
2fc0: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  rowid */.  int m
2fd0: 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  xSample;        
2fe0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2ff0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
3000: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
3010: 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  */.  Stat4Sample
3020: 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f   current;      /
3030: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73  * Current row as
3040: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a   a Stat4Sample *
3050: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
3080: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
3090: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61  ampling */.  Sta
30a0: 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b  t4Sample *aBest;
30b0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
30c0: 6f 66 20 28 6e 43 6f 6c 2d 31 29 20 62 65 73 74  of (nCol-1) best
30d0: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e   samples */.  in
30e0: 74 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20  t iMin;         
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3100: 20 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79   in a[] of entry
3110: 20 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63   with minimum sc
3120: 6f 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  ore */.  int nSa
3130: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
3140: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
3150: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
3160: 2a 2f 0a 20 20 69 6e 74 20 69 47 65 74 3b 20 20  */.  int iGet;  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3180: 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65  * Index of curre
3190: 6e 74 20 73 61 6d 70 6c 65 20 61 63 63 65 73 73  nt sample access
31a0: 65 64 20 62 79 20 73 74 61 74 5f 67 65 74 28 29  ed by stat_get()
31b0: 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c   */.  Stat4Sampl
31c0: 65 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  e *a;           
31d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 78 53 61  /* Array of mxSa
31e0: 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c 65  mple Stat4Sample
31f0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
3200: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3210: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
3220: 5f 69 6e 69 74 28 4e 2c 43 29 20 53 51 4c 20 66  _init(N,C) SQL f
3230: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 74 77 6f  unction. The two
3240: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3250: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
3260: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
3270: 6c 65 20 6f 72 20 69 6e 64 65 78 20 28 43 29 20  le or index (C) 
3280: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
3290: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
32a0: 74 68 65 20 69 6e 64 65 78 20 28 4e 29 2e 20 20  the index (N).  
32b0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
32c0: 65 6e 74 20 28 43 29 20 69 73 20 6f 6e 6c 79 20  ent (C) is only 
32d0: 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20 61  used for STAT3 a
32e0: 6e 64 20 53 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20  nd STAT4..**.** 
32f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
3300: 6f 63 61 74 65 73 20 74 68 65 20 53 74 61 74 34  ocates the Stat4
3310: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 69 6e 20  Accum object in 
3320: 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 65  heap memory. The
3330: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 76 61 6c 75   return .** valu
3340: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
3350: 6f 20 74 68 65 20 74 68 65 20 53 74 61 74 34 41  o the the Stat4A
3360: 63 63 75 6d 20 6f 62 6a 65 63 74 20 65 6e 63 6f  ccum object enco
3370: 64 65 64 20 61 73 20 61 20 62 6c 6f 62 20 28 69  ded as a blob (i
3380: 2e 65 2e 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65  .e. .** the size
3390: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 73 20   of the blob is 
33a0: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 62 79  sizeof(void*) by
33b0: 74 65 73 29 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tes). .*/.static
33c0: 20 76 6f 69 64 20 73 74 61 74 49 6e 69 74 28 0a   void statInit(.
33d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
33e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
33f0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3400: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3410: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
3420: 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  p;.  int nCol;  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3450: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
3460: 65 78 20 62 65 69 6e 67 20 73 61 6d 70 6c 65 64  ex being sampled
3470: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70   */.  int nColUp
3480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3490: 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f        /* nCol ro
34a0: 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c 69  unded up for ali
34b0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  gnment */.  int 
34c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
34e0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
34f0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 23 69 66   allocate */.#if
3500: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3510: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
3520: 0a 20 20 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20  .  int mxSample 
3530: 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53  = SQLITE_STAT4_S
3540: 41 4d 50 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a  AMPLES;.#endif..
3550: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
3560: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 20 61  three function a
3570: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e  rguments */.  UN
3580: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3590: 72 67 63 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73  rgc);.  nCol = s
35a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
35b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73  (argv[0]);.  ass
35c0: 65 72 74 28 20 6e 43 6f 6c 3e 31 20 29 3b 20 20  ert( nCol>1 );  
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e0: 3e 31 20 62 65 63 61 75 73 65 20 69 74 20 69 6e  >1 because it in
35f0: 63 6c 75 64 65 73 20 74 68 65 20 72 6f 77 69 64  cludes the rowid
3600: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 43 6f   column */.  nCo
3610: 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f  lUp = sizeof(tRo
3620: 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b  wcnt)<8 ? (nCol+
3630: 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 0a 20  1)&~1 : nCol;.. 
3640: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
3650: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
3660: 66 6f 72 20 74 68 65 20 53 74 61 74 34 41 63 63  for the Stat4Acc
3670: 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6e  um object */.  n
3680: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 0a 20   = sizeof(*p) . 
3690: 20 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77     + sizeof(tRow
36a0: 63 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20  cnt)*nColUp     
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c0: 53 74 61 74 34 41 63 63 75 6d 2e 61 6e 45 71 20  Stat4Accum.anEq 
36d0: 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  */.    + sizeof(
36e0: 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70 20  tRowcnt)*nColUp 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 61   /* Stat4Accum.a
3710: 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65 66 20 53  nDLt */.#ifdef S
3720: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
3730: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
3740: 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  + sizeof(tRowcnt
3750: 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20  )*nColUp        
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
3770: 74 34 41 63 63 75 6d 2e 61 6e 4c 74 20 2a 2f 0a  t4Accum.anLt */.
3780: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 53 74 61      + sizeof(Sta
3790: 74 34 53 61 6d 70 6c 65 29 2a 28 6e 43 6f 6c 2b  t4Sample)*(nCol+
37a0: 6d 78 53 61 6d 70 6c 65 29 20 20 20 2f 2a 20 53  mxSample)   /* S
37b0: 74 61 74 34 41 63 63 75 6d 2e 61 42 65 73 74 5b  tat4Accum.aBest[
37c0: 5d 2c 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20  ], a[] */.    + 
37d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
37e0: 33 2a 6e 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d  3*nColUp*(nCol+m
37f0: 78 53 61 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a  xSample).#endif.
3800: 20 20 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    ;.  p = sqlite
3810: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 29 3b 0a  3MallocZero(n);.
3820: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
3830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3840: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
3850: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
3860: 6e 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 52 6f  n;.  }..  p->nRo
3870: 77 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  w = 0;.  p->nCol
3880: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 70 2d 3e 63 75   = nCol;.  p->cu
3890: 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d 20 28 74  rrent.anDLt = (t
38a0: 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20  Rowcnt*)&p[1];. 
38b0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
38c0: 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e 61   = &p->current.a
38d0: 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a 23  nDLt[nColUp];..#
38e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
38f0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3900: 54 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70  T4.  {.    u8 *p
3910: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
3930: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e 6f  located space no
3940: 74 20 79 65 74 20 61 73 73 69 67 6e 65 64 20 2a  t yet assigned *
3950: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
3980: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3990: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f   p->aSample[] */
39a0: 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20  ..    p->iGet = 
39b0: 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61 6d  -1;.    p->mxSam
39c0: 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b 0a  ple = mxSample;.
39d0: 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65 20      p->nPSample 
39e0: 3d 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c 69  = (tRowcnt)(sqli
39f0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3a00: 61 72 67 76 5b 31 5d 29 2f 28 6d 78 53 61 6d 70  argv[1])/(mxSamp
3a10: 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20 20  le/3+1) + 1);.  
3a20: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c    p->current.anL
3a30: 74 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e  t = &p->current.
3a40: 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20 20  anEq[nColUp];.  
3a50: 20 20 70 2d 3e 69 50 72 6e 20 3d 20 6e 43 6f 6c    p->iPrn = nCol
3a60: 2a 30 78 36 38 39 65 39 36 32 64 20 5e 20 73 71  *0x689e962d ^ sq
3a70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
3a80: 61 72 67 76 5b 31 5d 29 2a 30 78 64 30 39 34 34  argv[1])*0xd0944
3a90: 35 36 35 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  565;.  .    /* S
3aa0: 65 74 20 75 70 20 74 68 65 20 53 74 61 74 34 41  et up the Stat4A
3ab0: 63 63 75 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65  ccum.a[] and aBe
3ac0: 73 74 5b 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20  st[] arrays */. 
3ad0: 20 20 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63     p->a = (struc
3ae0: 74 20 53 74 61 74 34 53 61 6d 70 6c 65 2a 29 26  t Stat4Sample*)&
3af0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b  p->current.anLt[
3b00: 6e 43 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e  nColUp];.    p->
3b10: 61 42 65 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78  aBest = &p->a[mx
3b20: 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70  Sample];.    pSp
3b30: 61 63 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e  ace = (u8*)(&p->
3b40: 61 5b 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d  a[mxSample+nCol]
3b50: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
3b60: 69 3c 28 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c  i<(mxSample+nCol
3b70: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); i++){.      p
3b80: 2d 3e 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74  ->a[i].anEq = (t
3b90: 52 6f 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b  Rowcnt *)pSpace;
3ba0: 20 70 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65   pSpace += (size
3bb0: 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43  of(tRowcnt) * nC
3bc0: 6f 6c 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  olUp);.      p->
3bd0: 61 5b 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f  a[i].anLt = (tRo
3be0: 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70  wcnt *)pSpace; p
3bf0: 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66  Space += (sizeof
3c00: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c  (tRowcnt) * nCol
3c10: 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  Up);.      p->a[
3c20: 69 5d 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77  i].anDLt = (tRow
3c30: 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53  cnt *)pSpace; pS
3c40: 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28  pace += (sizeof(
3c50: 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55  tRowcnt) * nColU
3c60: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  p);.    }.    as
3c70: 73 65 72 74 28 20 28 70 53 70 61 63 65 20 2d 20  sert( (pSpace - 
3c80: 28 75 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20  (u8*)p)==n );.  
3c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3ca0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
3cb0: 20 20 70 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43    p->aBest[i].iC
3cc0: 6f 6c 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ol = i;.    }.  
3cd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
3ce0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3cf0: 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
3d00: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63   object to the c
3d10: 61 6c 6c 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  aller */.  sqlit
3d20: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
3d30: 6f 6e 74 65 78 74 2c 20 70 2c 20 73 69 7a 65 6f  ontext, p, sizeo
3d40: 66 28 70 29 2c 20 73 71 6c 69 74 65 33 5f 66 72  f(p), sqlite3_fr
3d50: 65 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f  ee);.}.static co
3d60: 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74 61 74  nst FuncDef stat
3d70: 49 6e 69 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a  InitFuncdef = {.
3d80: 20 20 31 2b 49 73 53 74 61 74 33 34 2c 20 20 20    1+IsStat34,   
3d90: 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20     /* nArg */.  
3da0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
3db0: 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f   /* funcFlags */
3dc0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3dd0: 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61      /* pUserData
3de0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3df0: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
3e00: 2a 2f 0a 20 20 73 74 61 74 49 6e 69 74 2c 20 20  */.  statInit,  
3e10: 20 20 20 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a        /* xFunc *
3e20: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
3e30: 20 20 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f       /* xStep */
3e40: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3e50: 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65      /* xFinalize
3e60: 20 2a 2f 0a 20 20 22 73 74 61 74 5f 69 6e 69 74   */.  "stat_init
3e70: 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ",     /* zName 
3e80: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
3e90: 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68 20 2a        /* pHash *
3ea0: 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
3eb0: 20 20 20 20 20 2f 2a 20 70 44 65 73 74 72 75 63       /* pDestruc
3ec0: 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65  tor */.};..#ifde
3ed0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3ee0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 70 4e 65 77  STAT4./*.** pNew
3ef0: 20 61 6e 64 20 70 4f 6c 64 20 61 72 65 20 62 6f   and pOld are bo
3f00: 74 68 20 63 61 6e 64 69 64 61 74 65 20 6e 6f 6e  th candidate non
3f10: 2d 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65  -periodic sample
3f20: 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20 0a  s selected for .
3f30: 2a 2a 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  ** the same colu
3f40: 6d 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d  mn (pNew->iCol==
3f50: 70 4f 6c 64 2d 3e 69 43 6f 6c 29 2e 20 49 67 6e  pOld->iCol). Ign
3f60: 6f 72 69 6e 67 20 74 68 69 73 20 63 6f 6c 75 6d  oring this colum
3f70: 6e 20 61 6e 64 20 0a 2a 2a 20 63 6f 6e 73 69 64  n and .** consid
3f80: 65 72 69 6e 67 20 6f 6e 6c 79 20 61 6e 79 20 74  ering only any t
3f90: 72 61 69 6c 69 6e 67 20 63 6f 6c 75 6d 6e 73 20  railing columns 
3fa0: 61 6e 64 20 74 68 65 20 73 61 6d 70 6c 65 20 68  and the sample h
3fb0: 61 73 68 20 76 61 6c 75 65 2c 20 74 68 69 73 0a  ash value, this.
3fc0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
3fd0: 72 6e 73 20 74 72 75 65 20 69 66 20 73 61 6d 70  rns true if samp
3fe0: 6c 65 20 70 4e 65 77 20 69 73 20 74 6f 20 62 65  le pNew is to be
3ff0: 20 70 72 65 66 65 72 72 65 64 20 6f 76 65 72 20   preferred over 
4000: 70 4f 6c 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  pOld..** In othe
4010: 72 20 77 6f 72 64 73 2c 20 69 66 20 77 65 20 61  r words, if we a
4020: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63  ssume that the c
4030: 61 72 64 69 6e 61 6c 69 74 69 65 73 20 6f 66 20  ardinalities of 
4040: 74 68 65 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  the selected.** 
4050: 63 6f 6c 75 6d 6e 20 66 6f 72 20 70 4e 65 77 20  column for pNew 
4060: 61 6e 64 20 70 4f 6c 64 20 61 72 65 20 65 71 75  and pOld are equ
4070: 61 6c 2c 20 69 73 20 70 4e 65 77 20 74 6f 20 62  al, is pNew to b
4080: 65 20 70 72 65 66 65 72 72 65 64 20 6f 76 65 72  e preferred over
4090: 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pOld..**.** Thi
40a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
40b0: 65 73 20 74 68 61 74 20 66 6f 72 20 65 61 63 68  es that for each
40c0: 20 61 72 67 75 6d 65 6e 74 20 73 61 6d 70 6c 65   argument sample
40d0: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
40e0: 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71 5b 5d 20  f.** the anEq[] 
40f0: 61 72 72 61 79 20 66 72 6f 6d 20 70 53 61 6d 70  array from pSamp
4100: 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d 70 6c 65  le->anEq[pSample
4110: 2d 3e 69 43 6f 6c 2b 31 5d 20 6f 6e 77 61 72 64  ->iCol+1] onward
4120: 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f  s are valid. .*/
4130: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70  .static int samp
4140: 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 0a  leIsBetterPost(.
4150: 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41    Stat4Accum *pA
4160: 63 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61  ccum, .  Stat4Sa
4170: 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53  mple *pNew, .  S
4180: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64  tat4Sample *pOld
4190: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  .){.  int nCol =
41a0: 20 70 41 63 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20   pAccum->nCol;. 
41b0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
41c0: 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f  ( pNew->iCol==pO
41d0: 6c 64 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 66 6f  ld->iCol );.  fo
41e0: 72 28 69 3d 70 4e 65 77 2d 3e 69 43 6f 6c 2b 31  r(i=pNew->iCol+1
41f0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
4200: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e      if( pNew->an
4210: 45 71 5b 69 5d 3e 70 4f 6c 64 2d 3e 61 6e 45 71  Eq[i]>pOld->anEq
4220: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  [i] ) return 1;.
4230: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e      if( pNew->an
4240: 45 71 5b 69 5d 3c 70 4f 6c 64 2d 3e 61 6e 45 71  Eq[i]<pOld->anEq
4250: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
4260: 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e    }.  if( pNew->
4270: 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73  iHash>pOld->iHas
4280: 68 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  h ) return 1;.  
4290: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
42a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
42b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
42c0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65  R_STAT4./*.** Re
42d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 4e 65  turn true if pNe
42e0: 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66 65  w is to be prefe
42f0: 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a  rred over pOld..
4300: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4310: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
4320: 20 66 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65   for each argume
4330: 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63  nt sample, the c
4340: 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  ontents of.** th
4350: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66  e anEq[] array f
4360: 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  rom pSample->anE
4370: 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d  q[pSample->iCol]
4380: 20 6f 6e 77 61 72 64 73 20 61 72 65 20 76 61 6c   onwards are val
4390: 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id. .*/.static i
43a0: 6e 74 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  nt sampleIsBette
43b0: 72 28 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20  r(.  Stat4Accum 
43c0: 2a 70 41 63 63 75 6d 2c 20 0a 20 20 53 74 61 74  *pAccum, .  Stat
43d0: 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a  4Sample *pNew, .
43e0: 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70    Stat4Sample *p
43f0: 4f 6c 64 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74  Old.){.  tRowcnt
4400: 20 6e 45 71 4e 65 77 20 3d 20 70 4e 65 77 2d 3e   nEqNew = pNew->
4410: 61 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d  anEq[pNew->iCol]
4420: 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4f  ;.  tRowcnt nEqO
4430: 6c 64 20 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b  ld = pOld->anEq[
4440: 70 4f 6c 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20  pOld->iCol];..  
4450: 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 73  assert( pOld->is
4460: 50 53 61 6d 70 6c 65 3d 3d 30 20 26 26 20 70 4e  PSample==0 && pN
4470: 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30  ew->isPSample==0
4480: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73   );.  assert( Is
4490: 53 74 61 74 34 20 7c 7c 20 28 70 4e 65 77 2d 3e  Stat4 || (pNew->
44a0: 69 43 6f 6c 3d 3d 30 20 26 26 20 70 4f 6c 64 2d  iCol==0 && pOld-
44b0: 3e 69 43 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  >iCol==0) );..  
44c0: 69 66 28 20 28 6e 45 71 4e 65 77 3e 6e 45 71 4f  if( (nEqNew>nEqO
44d0: 6c 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ld) ) return 1;.
44e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
44f0: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28  ABLE_STAT4.  if(
4500: 20 6e 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20   nEqNew==nEqOld 
4510: 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ){.    if( pNew-
4520: 3e 69 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c  >iCol<pOld->iCol
4530: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4540: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 2d 3e 69   return (pNew->i
4550: 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20  Col==pOld->iCol 
4560: 26 26 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  && sampleIsBette
4570: 72 50 6f 73 74 28 70 41 63 63 75 6d 2c 20 70 4e  rPost(pAccum, pN
4580: 65 77 2c 20 70 4f 6c 64 29 29 3b 0a 20 20 7d 0a  ew, pOld));.  }.
4590: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
45a0: 65 0a 20 20 72 65 74 75 72 6e 20 28 6e 45 71 4e  e.  return (nEqN
45b0: 65 77 3d 3d 6e 45 71 4f 6c 64 20 26 26 20 70 4e  ew==nEqOld && pN
45c0: 65 77 2d 3e 69 48 61 73 68 3e 70 4f 6c 64 2d 3e  ew->iHash>pOld->
45d0: 69 48 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 7d  iHash);.#endif.}
45e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
45f0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 62 6a   contents of obj
4600: 65 63 74 20 28 2a 70 46 72 6f 6d 29 20 69 6e 74  ect (*pFrom) int
4610: 6f 20 28 2a 70 54 6f 29 2e 0a 2a 2f 0a 76 6f 69  o (*pTo)..*/.voi
4620: 64 20 73 61 6d 70 6c 65 43 6f 70 79 28 53 74 61  d sampleCopy(Sta
4630: 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74 61 74  t4Accum *p, Stat
4640: 34 53 61 6d 70 6c 65 20 2a 70 54 6f 2c 20 53 74  4Sample *pTo, St
4650: 61 74 34 53 61 6d 70 6c 65 20 2a 70 46 72 6f 6d  at4Sample *pFrom
4660: 29 7b 0a 20 20 70 54 6f 2d 3e 69 52 6f 77 69 64  ){.  pTo->iRowid
4670: 20 3d 20 70 46 72 6f 6d 2d 3e 69 52 6f 77 69 64   = pFrom->iRowid
4680: 3b 0a 20 20 70 54 6f 2d 3e 69 73 50 53 61 6d 70  ;.  pTo->isPSamp
4690: 6c 65 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 50 53  le = pFrom->isPS
46a0: 61 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d 3e 69 43  ample;.  pTo->iC
46b0: 6f 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69 43 6f 6c  ol = pFrom->iCol
46c0: 3b 0a 20 20 70 54 6f 2d 3e 69 48 61 73 68 20 3d  ;.  pTo->iHash =
46d0: 20 70 46 72 6f 6d 2d 3e 69 48 61 73 68 3b 0a 20   pFrom->iHash;. 
46e0: 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 45   memcpy(pTo->anE
46f0: 71 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45 71 2c 20  q, pFrom->anEq, 
4700: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
4710: 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63  p->nCol);.  memc
4720: 70 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c 20 70 46  py(pTo->anLt, pF
4730: 72 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69 7a 65 6f  rom->anLt, sizeo
4740: 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43  f(tRowcnt)*p->nC
4750: 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ol);.  memcpy(pT
4760: 6f 2d 3e 61 6e 44 4c 74 2c 20 70 46 72 6f 6d 2d  o->anDLt, pFrom-
4770: 3e 61 6e 44 4c 74 2c 20 73 69 7a 65 6f 66 28 74  >anDLt, sizeof(t
4780: 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29  Rowcnt)*p->nCol)
4790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
47a0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
47b0: 73 61 6d 70 6c 65 20 2a 70 4e 65 77 20 69 6e 74  sample *pNew int
47c0: 6f 20 74 68 65 20 70 2d 3e 61 5b 5d 20 61 72 72  o the p->a[] arr
47d0: 61 79 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  ay. If necessary
47e0: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
47f0: 6c 65 61 73 74 20 64 65 73 69 72 61 62 6c 65 20  least desirable 
4800: 73 61 6d 70 6c 65 20 66 72 6f 6d 20 70 2d 3e 61  sample from p->a
4810: 5b 5d 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 2e  [] to make room.
4820: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4830: 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 53 74 61  sampleInsert(Sta
4840: 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74 61 74  t4Accum *p, Stat
4850: 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 69  4Sample *pNew, i
4860: 6e 74 20 6e 45 71 5a 65 72 6f 29 7b 0a 20 20 53  nt nEqZero){.  S
4870: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 53 61 6d  tat4Sample *pSam
4880: 70 6c 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ple;.  int i;.. 
4890: 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34   assert( IsStat4
48a0: 20 7c 7c 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29   || nEqZero==0 )
48b0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
48c0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
48d0: 69 66 28 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d  if( pNew->isPSam
48e0: 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74  ple==0 ){.    St
48f0: 61 74 34 53 61 6d 70 6c 65 20 2a 70 55 70 67 72  at4Sample *pUpgr
4900: 61 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ade = 0;.    ass
4910: 65 72 74 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b  ert( pNew->anEq[
4920: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b  pNew->iCol]>0 );
4930: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 61  ..    /* This sa
4940: 6d 70 6c 65 20 69 73 20 62 65 69 6e 67 20 61 64  mple is being ad
4950: 64 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20  ded because the 
4960: 70 72 65 66 69 78 20 74 68 61 74 20 65 6e 64 73  prefix that ends
4970: 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20   in column .    
4980: 2a 2a 20 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d  ** iCol occurs m
4990: 61 6e 79 20 74 69 6d 65 73 20 69 6e 20 74 68 65  any times in the
49a0: 20 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c   table. However,
49b0: 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
49c0: 61 64 79 0a 20 20 20 20 2a 2a 20 61 64 64 65 64  ady.    ** added
49d0: 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73   a sample that s
49e0: 68 61 72 65 73 20 74 68 69 73 20 70 72 65 66 69  hares this prefi
49f0: 78 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  x, there is no n
4a00: 65 65 64 20 74 6f 20 61 64 64 0a 20 20 20 20 2a  eed to add.    *
4a10: 2a 20 74 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74  * this one. Inst
4a20: 65 61 64 2c 20 75 70 67 72 61 64 65 20 74 68 65  ead, upgrade the
4a30: 20 70 72 69 6f 72 69 74 79 20 6f 66 20 74 68 65   priority of the
4a40: 20 68 69 67 68 65 73 74 20 70 72 69 6f 72 69 74   highest priorit
4a50: 79 0a 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e  y.    ** existin
4a60: 67 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68  g sample that sh
4a70: 61 72 65 73 20 74 68 69 73 20 70 72 65 66 69 78  ares this prefix
4a80: 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
4a90: 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e  p->nSample-1; i>
4aa0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
4ab0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c  Stat4Sample *pOl
4ac0: 64 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  d = &p->a[i];.  
4ad0: 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e      if( pOld->an
4ae0: 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d  Eq[pNew->iCol]==
4af0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4b00: 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65   pOld->isPSample
4b10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
4b20: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d     assert( pOld-
4b30: 3e 69 43 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f 6c  >iCol>pNew->iCol
4b40: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
4b50: 72 74 28 20 73 61 6d 70 6c 65 49 73 42 65 74 74  rt( sampleIsBett
4b60: 65 72 28 70 2c 20 70 4e 65 77 2c 20 70 4f 6c 64  er(p, pNew, pOld
4b70: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
4b80: 20 70 55 70 67 72 61 64 65 3d 3d 30 20 7c 7c 20   pUpgrade==0 || 
4b90: 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70  sampleIsBetter(p
4ba0: 2c 20 70 4f 6c 64 2c 20 70 55 70 67 72 61 64 65  , pOld, pUpgrade
4bb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
4bc0: 55 70 67 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a  Upgrade = pOld;.
4bd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4be0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4bf0: 70 55 70 67 72 61 64 65 20 29 7b 0a 20 20 20 20  pUpgrade ){.    
4c00: 20 20 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c    pUpgrade->iCol
4c10: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20   = pNew->iCol;. 
4c20: 20 20 20 20 20 70 55 70 67 72 61 64 65 2d 3e 61       pUpgrade->a
4c30: 6e 45 71 5b 70 55 70 67 72 61 64 65 2d 3e 69 43  nEq[pUpgrade->iC
4c40: 6f 6c 5d 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71  ol] = pNew->anEq
4c50: 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d  [pUpgrade->iCol]
4c60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  ;.      goto fin
4c70: 64 5f 6e 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d  d_new_min;.    }
4c80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4c90: 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  * If necessary, 
4ca0: 72 65 6d 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d  remove sample iM
4cb0: 69 6e 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  in to make room 
4cc0: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 61 6d 70  for the new samp
4cd0: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  le. */.  if( p->
4ce0: 6e 53 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61  nSample>=p->mxSa
4cf0: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 53 74 61 74  mple ){.    Stat
4d00: 34 53 61 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20  4Sample *pMin = 
4d10: 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a  &p->a[p->iMin];.
4d20: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45      tRowcnt *anE
4d30: 71 20 3d 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a  q = pMin->anEq;.
4d40: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c      tRowcnt *anL
4d50: 74 20 3d 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a  t = pMin->anLt;.
4d60: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44      tRowcnt *anD
4d70: 4c 74 20 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74  Lt = pMin->anDLt
4d80: 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4d  ;.    memmove(pM
4d90: 69 6e 2c 20 26 70 4d 69 6e 5b 31 5d 2c 20 73 69  in, &pMin[1], si
4da0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 2a 28 70  zeof(p->a[0])*(p
4db0: 2d 3e 6e 53 61 6d 70 6c 65 2d 70 2d 3e 69 4d 69  ->nSample-p->iMi
4dc0: 6e 2d 31 29 29 3b 0a 20 20 20 20 70 53 61 6d 70  n-1));.    pSamp
4dd0: 6c 65 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  le = &p->a[p->nS
4de0: 61 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 70 53  ample-1];.    pS
4df0: 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61 6e  ample->anEq = an
4e00: 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  Eq;.    pSample-
4e10: 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b 0a  >anDLt = anDLt;.
4e20: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c      pSample->anL
4e30: 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20 70 2d  t = anLt;.    p-
4e40: 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6d 78  >nSample = p->mx
4e50: 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a 0a 20  Sample-1;.  }.. 
4e60: 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20 6c 65   /* The "rows le
4e70: 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74 68 65  ss-than" for the
4e80: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6d 75   rowid column mu
4e90: 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
4ea0: 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f 72  an that.  ** for
4eb0: 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70 6c 65   the last sample
4ec0: 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d 20 61   in the p->a[] a
4ed0: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
4ee0: 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77 6f 75   the samples wou
4ef0: 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74 20 6f  ld.  ** be out o
4f00: 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69 66 64  f order. */.#ifd
4f10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4f20: 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74 28  _STAT4.  assert(
4f30: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 0a   p->nSample==0 .
4f40: 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
4f50: 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 20  anLt[p->nCol-1] 
4f60: 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c  > p->a[p->nSampl
4f70: 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f  e-1].anLt[p->nCo
4f80: 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  l-1] );.#endif..
4f90: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
4fa0: 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  new sample */.  
4fb0: 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b  pSample = &p->a[
4fc0: 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 73  p->nSample];.  s
4fd0: 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70 53 61  ampleCopy(p, pSa
4fe0: 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20 20 70  mple, pNew);.  p
4ff0: 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a 20 20  ->nSample++;..  
5000: 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72 73  /* Zero the firs
5010: 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72 69 65  t nEqZero entrie
5020: 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d 20  s in the anEq[] 
5030: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65 6d 73  array. */.  mems
5040: 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71  et(pSample->anEq
5050: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77  , 0, sizeof(tRow
5060: 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b 0a 0a  cnt)*nEqZero);..
5070: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5080: 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69 6e 64  ABLE_STAT4. find
5090: 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64 69 66  _new_min:.#endif
50a0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
50b0: 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  e>=p->mxSample )
50c0: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e 20 3d  {.    int iMin =
50d0: 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
50e0: 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b  ; i<p->mxSample;
50f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5100: 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d 70   p->a[i].isPSamp
5110: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
5120: 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30 20       if( iMin<0 
5130: 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  || sampleIsBette
5140: 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e 5d  r(p, &p->a[iMin]
5150: 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a 20  , &p->a[i]) ){. 
5160: 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b         iMin = i;
5170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5180: 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e 3e     assert( iMin>
5190: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d 69  =0 );.    p->iMi
51a0: 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a  n = iMin;.  }.}.
51b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
51c0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
51d0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
51e0: 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f 66 20   Field iChng of 
51f0: 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
5200: 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68 61 6e  scanned has chan
5210: 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69 73 20  ged. So at this 
5220: 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72 72  point.** p->curr
5230: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ent contains a s
5240: 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66 6c 65  ample that refle
5250: 63 74 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  cts the previous
5260: 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 69   row of the.** i
5270: 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75 65 20  ndex. The value 
5280: 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20 61  of anEq[iChng] a
5290: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 6e  nd subsequent an
52a0: 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61 72  Eq[] elements ar
52b0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 74 20  e.** correct at 
52c0: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  this point..*/.s
52d0: 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c  tatic void sampl
52e0: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 53 74  ePushPrevious(St
52f0: 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e 74  at4Accum *p, int
5300: 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65 66 20   iChng){.#ifdef 
5310: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
5320: 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  AT4.  int i;..  
5330: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20  /* Check if any 
5340: 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68 65  samples from the
5350: 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79 20 73   aBest[] array s
5360: 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65 64 0a  hould be pushed.
5370: 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78 53    ** into IndexS
5380: 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68 69  ample.a[] at thi
5390: 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 66  s point.  */.  f
53a0: 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32 29  or(i=(p->nCol-2)
53b0: 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d 29  ; i>=iChng; i--)
53c0: 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c  {.    Stat4Sampl
53d0: 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e 61  e *pBest = &p->a
53e0: 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70 42 65  Best[i];.    pBe
53f0: 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 70 2d  st->anEq[i] = p-
5400: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d  >current.anEq[i]
5410: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 61  ;.    if( p->nSa
5420: 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65  mple<p->mxSample
5430: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
5440: 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26 70 2d  er(p, pBest, &p-
5450: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29 7b 0a  >a[p->iMin]) ){.
5460: 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65        sampleInse
5470: 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69 29 3b  rt(p, pBest, i);
5480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5490: 20 55 70 64 61 74 65 20 74 68 65 20 61 6e 45 71   Update the anEq
54a0: 5b 5d 20 66 69 65 6c 64 73 20 6f 66 20 61 6e 79  [] fields of any
54b0: 20 73 61 6d 70 6c 65 73 20 61 6c 72 65 61 64 79   samples already
54c0: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a 20   collected. */. 
54d0: 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c   for(i=p->nSampl
54e0: 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  e-1; i>=0; i--){
54f0: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
5500: 66 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70  for(j=iChng; j<p
5510: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
5520: 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e      if( p->a[i].
5530: 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d 3e  anEq[j]==0 ) p->
5540: 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20 70  a[i].anEq[j] = p
5550: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6a  ->current.anEq[j
5560: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  ];.    }.  }.#en
5570: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
5580: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
5590: 54 41 54 33 29 20 26 26 20 21 64 65 66 69 6e 65  TAT3) && !define
55a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
55b0: 53 54 41 54 34 29 0a 20 20 69 66 28 20 69 43 68  STAT4).  if( iCh
55c0: 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 74 52 6f  ng==0 ){.    tRo
55d0: 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75  wcnt nLt = p->cu
55e0: 72 72 65 6e 74 2e 61 6e 4c 74 5b 30 5d 3b 0a 20  rrent.anLt[0];. 
55f0: 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 20 3d     tRowcnt nEq =
5600: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
5610: 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  [0];..    /* Che
5620: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 6f  ck if this is to
5630: 20 62 65 20 61 20 70 65 72 69 6f 64 69 63 20 73   be a periodic s
5640: 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64  ample. If so, ad
5650: 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d it. */.    if(
5660: 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c   (nLt/p->nPSampl
5670: 65 29 21 3d 28 6e 4c 74 2b 6e 45 71 29 2f 70 2d  e)!=(nLt+nEq)/p-
5680: 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >nPSample ){.   
5690: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
56a0: 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20  PSample = 1;.   
56b0: 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28     sampleInsert(
56c0: 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20  p, &p->current, 
56d0: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  0);.      p->cur
56e0: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
56f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a   0;.    }else ..
5700: 20 20 20 20 2f 2a 20 4f 72 20 69 66 20 69 74 20      /* Or if it 
5710: 69 73 20 61 20 6e 6f 6e 2d 70 65 72 69 6f 64 69  is a non-periodi
5720: 63 20 73 61 6d 70 6c 65 2e 20 41 64 64 20 69 74  c sample. Add it
5730: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 6f   in this case to
5740: 6f 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  o. */.    if( p-
5750: 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61  >nSample<p->mxSa
5760: 6d 70 6c 65 20 0a 20 20 20 20 20 7c 7c 20 73 61  mple .     || sa
5770: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
5780: 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70 2d  &p->current, &p-
5790: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 0a 20 20  >a[p->iMin]) .  
57a0: 20 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c    ){.      sampl
57b0: 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63  eInsert(p, &p->c
57c0: 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  urrent, 0);.    
57d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
57e0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
57f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
5800: 5f 70 75 73 68 20 53 51 4c 20 66 75 6e 63 74 69  _push SQL functi
5810: 6f 6e 3a 20 20 73 74 61 74 5f 70 75 73 68 28 50  on:  stat_push(P
5820: 2c 52 2c 43 29 0a 2a 2a 20 41 72 67 75 6d 65 6e  ,R,C).** Argumen
5830: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 20 20  ts:.**.**    P  
5840: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
5850: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
5860: 65 63 74 20 63 72 65 61 74 65 64 20 62 79 20 73  ect created by s
5870: 74 61 74 5f 69 6e 69 74 28 29 0a 2a 2a 20 20 20  tat_init().**   
5880: 20 43 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20   C     Index of 
5890: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
58a0: 20 74 6f 20 64 69 66 66 65 72 20 66 72 6f 6d 20   to differ from 
58b0: 70 72 65 76 69 6f 75 73 20 72 6f 77 0a 2a 2a 20  previous row.** 
58c0: 20 20 20 52 20 20 20 20 20 52 6f 77 69 64 20 66     R     Rowid f
58d0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
58e0: 6f 77 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  ow.**.** The SQL
58f0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
5900: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
5910: 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61 6d  *.** The R param
5920: 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73 65  eter is only use
5930: 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20  d for STAT3 and 
5940: 53 54 41 54 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  STAT4..*/.static
5950: 20 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a   void statPush(.
5960: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5970: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5980: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5990: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
59a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
59b0: 20 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   The three funct
59c0: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
59d0: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
59e0: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
59f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5a00: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
5a10: 6e 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74  nt iChng = sqlit
5a20: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
5a30: 76 5b 31 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74  v[1]);..  assert
5a40: 28 20 70 2d 3e 6e 43 6f 6c 3e 31 20 29 3b 20 20  ( p->nCol>1 );  
5a50: 20 20 20 20 20 20 2f 2a 20 49 6e 63 6c 75 64 65        /* Include
5a60: 73 20 72 6f 77 69 64 20 66 69 65 6c 64 20 2a 2f  s rowid field */
5a70: 0a 20 20 61 73 73 65 72 74 28 20 69 43 68 6e 67  .  assert( iChng
5a80: 3c 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69  <p->nCol );..  i
5a90: 66 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b  f( p->nRow==0 ){
5aa0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
5ab0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
5ac0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
5ad0: 20 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   Do initializati
5ae0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  on. */.    for(i
5af0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
5b00: 2b 2b 29 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ++) p->current.a
5b10: 6e 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 65  nEq[i] = 1;.  }e
5b20: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 63 6f  lse{.    /* Seco
5b30: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
5b40: 74 20 63 61 6c 6c 73 20 67 65 74 20 70 72 6f 63  t calls get proc
5b50: 65 73 73 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  essed here */.  
5b60: 20 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76    samplePushPrev
5b70: 69 6f 75 73 28 70 2c 20 69 43 68 6e 67 29 3b 0a  ious(p, iChng);.
5b80: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61  .    /* Update a
5b90: 6e 44 4c 74 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61  nDLt[], anLt[] a
5ba0: 6e 64 20 61 6e 45 71 5b 5d 20 74 6f 20 72 65 66  nd anEq[] to ref
5bb0: 6c 65 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  lect the values 
5bc0: 74 68 61 74 20 61 70 70 6c 79 0a 20 20 20 20 2a  that apply.    *
5bd0: 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * to the current
5be0: 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 64 65   row of the inde
5bf0: 78 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  x. */.    for(i=
5c00: 30 3b 20 69 3c 69 43 68 6e 67 3b 20 69 2b 2b 29  0; i<iChng; i++)
5c10: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65  {.      p->curre
5c20: 6e 74 2e 61 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20  nt.anEq[i]++;.  
5c30: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 43    }.    for(i=iC
5c40: 68 6e 67 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  hng; i<p->nCol; 
5c50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  i++){.      p->c
5c60: 75 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b  urrent.anDLt[i]+
5c70: 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
5c80: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
5c90: 5f 53 54 41 54 34 0a 20 20 20 20 20 20 70 2d 3e  _STAT4.      p->
5ca0: 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20  current.anLt[i] 
5cb0: 2b 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  += p->current.an
5cc0: 45 71 5b 69 5d 3b 0a 23 65 6e 64 69 66 0a 20 20  Eq[i];.#endif.  
5cd0: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61      p->current.a
5ce0: 6e 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20  nEq[i] = 1;.    
5cf0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b  }.  }.  p->nRow+
5d00: 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
5d10: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
5d20: 5f 53 54 41 54 34 0a 20 20 70 2d 3e 63 75 72 72  _STAT4.  p->curr
5d30: 65 6e 74 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c  ent.iRowid = sql
5d40: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
5d50: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70 2d 3e  (argv[2]);.  p->
5d60: 63 75 72 72 65 6e 74 2e 69 48 61 73 68 20 3d 20  current.iHash = 
5d70: 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69 50 72  p->iPrn = p->iPr
5d80: 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31  n*1103515245 + 1
5d90: 32 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  2345;.#endif..#i
5da0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5db0: 4c 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20  LE_STAT4.  {.   
5dc0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
5dd0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 70  ->current.anLt[p
5de0: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20  ->nCol-1];..    
5df0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
5e00: 20 69 73 20 74 6f 20 62 65 20 61 20 70 65 72 69   is to be a peri
5e10: 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20  odic sample. If 
5e20: 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20  so, add it. */. 
5e30: 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e     if( (nLt/p->n
5e40: 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 31  PSample)!=(nLt+1
5e50: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
5e60: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
5e70: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
5e80: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
5e90: 74 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  t.iCol = 0;.    
5ea0: 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70    sampleInsert(p
5eb0: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 70  , &p->current, p
5ec0: 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ->nCol-1);.     
5ed0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53   p->current.isPS
5ee0: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ample = 0;.    }
5ef0: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
5f00: 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61  the aBest[] arra
5f10: 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  y. */.    for(i=
5f20: 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29  0; i<(p->nCol-1)
5f30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
5f40: 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20 3d 20  >current.iCol = 
5f50: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  i;.      if( i>=
5f60: 69 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c 65 49  iChng || sampleI
5f70: 73 42 65 74 74 65 72 50 6f 73 74 28 70 2c 20 26  sBetterPost(p, &
5f80: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70 2d 3e  p->current, &p->
5f90: 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20 20 20  aBest[i]) ){.   
5fa0: 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70 79 28       sampleCopy(
5fb0: 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d 2c  p, &p->aBest[i],
5fc0: 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b 0a 20   &p->current);. 
5fd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fe0: 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
5ff0: 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73   const FuncDef s
6000: 74 61 74 50 75 73 68 46 75 6e 63 64 65 66 20 3d  tatPushFuncdef =
6010: 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33 34 2c   {.  2+IsStat34,
6020: 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f        /* nArg */
6030: 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  .  SQLITE_UTF8, 
6040: 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73      /* funcFlags
6050: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
6060: 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44         /* pUserD
6070: 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
6090: 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75 73 68  xt */.  statPush
60a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6e  ,        /* xFun
60b0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
60c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74 65 70          /* xStep
60d0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
60e0: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c         /* xFinal
60f0: 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f 70  ize */.  "stat_p
6100: 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61  ush",     /* zNa
6110: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73           /* pHas
6130: 68 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  h */.  0        
6140: 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74          /* pDest
6150: 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 23 64  ructor */.};..#d
6160: 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 53  efine STAT_GET_S
6170: 54 41 54 31 20 30 20 20 20 20 20 20 20 20 20 20  TAT1 0          
6180: 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e  /* "stat" column
6190: 20 6f 66 20 73 74 61 74 31 20 74 61 62 6c 65 20   of stat1 table 
61a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
61b0: 47 45 54 5f 52 4f 57 49 44 20 31 20 20 20 20 20  GET_ROWID 1     
61c0: 20 20 20 20 20 2f 2a 20 22 72 6f 77 69 64 22 20       /* "rowid" 
61d0: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
61e0: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
61f0: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ine STAT_GET_NEQ
6200: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f 2a     2          /*
6210: 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e 20 6f 66   "neq" column of
6220: 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20   stat[34] entry 
6230: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
6240: 47 45 54 5f 4e 4c 54 20 20 20 33 20 20 20 20 20  GET_NLT   3     
6250: 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22 20 63 6f       /* "nlt" co
6260: 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d  lumn of stat[34]
6270: 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e   entry */.#defin
6280: 65 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20  e STAT_GET_NDLT 
6290: 20 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22   4          /* "
62a0: 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  ndlt" column of 
62b0: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
62c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
62d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
62e0: 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 53 51 4c  tat_get(P,J) SQL
62f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6300: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75   routine is.** u
6310: 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  sed to query the
6320: 20 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e 74 65   results.  Conte
6330: 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  nt is returned f
6340: 6f 72 20 70 61 72 61 6d 65 74 65 72 20 4a 0a 2a  or parameter J.*
6350: 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 65 20 6f  * which is one o
6360: 66 20 74 68 65 20 53 54 41 54 5f 47 45 54 5f 78  f the STAT_GET_x
6370: 78 78 78 20 76 61 6c 75 65 73 20 64 65 66 69 6e  xxx values defin
6380: 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ed above..**.** 
6390: 49 66 20 6e 65 69 74 68 65 72 20 53 54 41 54 33  If neither STAT3
63a0: 20 6e 6f 72 20 53 54 41 54 34 20 61 72 65 20 65   nor STAT4 are e
63b0: 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a 20 69  nabled, then J i
63c0: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54 41 54  s always.** STAT
63d0: 5f 47 45 54 5f 53 54 41 54 31 20 61 6e 64 20 69  _GET_STAT1 and i
63e0: 73 20 68 65 6e 63 65 20 6f 6d 69 74 74 65 64 20  s hence omitted 
63f0: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
6400: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 6f 6e   becomes.** a on
6410: 65 2d 70 61 72 61 6d 65 74 65 72 20 66 75 6e 63  e-parameter func
6420: 74 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74 28 50  tion, stat_get(P
6430: 29 2c 20 74 68 61 74 20 61 6c 77 61 79 73 20 72  ), that always r
6440: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 73 74  eturns the.** st
6450: 61 74 31 20 74 61 62 6c 65 20 65 6e 74 72 79 20  at1 table entry 
6460: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
6470: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
6480: 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Get(.  sqlite3_c
6490: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
64a0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
64b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
64c0: 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63  rgv.){.  Stat4Ac
64d0: 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41  cum *p = (Stat4A
64e0: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61  ccum*)sqlite3_va
64f0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
6500: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6510: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
6520: 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 54 41 54  _STAT4.  /* STAT
6530: 33 20 61 6e 64 20 53 54 41 54 34 20 68 61 76 65  3 and STAT4 have
6540: 20 61 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 20   a parameter on 
6550: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
6560: 0a 20 20 69 6e 74 20 65 43 61 6c 6c 20 3d 20 73  .  int eCall = s
6570: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6580: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
6590: 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a  ert( argc==2 );.
65a0: 20 20 61 73 73 65 72 74 28 20 65 43 61 6c 6c 3d    assert( eCall=
65b0: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
65c0: 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47  || eCall==STAT_G
65d0: 45 54 5f 4e 45 51 20 0a 20 20 20 20 20 20 20 7c  ET_NEQ .       |
65e0: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
65f0: 54 5f 52 4f 57 49 44 20 7c 7c 20 65 43 61 6c 6c  T_ROWID || eCall
6600: 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 4c 54 0a 20  ==STAT_GET_NLT. 
6610: 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d        || eCall==
6620: 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20 0a 20  STAT_GET_NDLT . 
6630: 20 29 3b 0a 20 20 69 66 28 20 65 43 61 6c 6c 3d   );.  if( eCall=
6640: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
6650: 29 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74  ).#else.  assert
6660: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 23 65 6e  ( argc==1 );.#en
6670: 64 69 66 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 52  dif.  {.    /* R
6680: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
6690: 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  to store in the 
66a0: 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66  "stat" column of
66b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
66c0: 31 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 66  1.    ** table f
66d0: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  or this index.. 
66e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
66f0: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
6700: 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61  ng composed of a
6710: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72   list of integer
6720: 73 20 64 65 73 63 72 69 62 69 6e 67 20 0a 20 20  s describing .  
6730: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20    ** the index. 
6740: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
6750: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  r in the list is
6760: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
6770: 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20 65 6e 74  r of .    ** ent
6780: 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ries in the inde
6790: 78 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  x. There is one 
67a0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
67b0: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 0a  er in the list .
67c0: 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
67d0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
67e0: 54 68 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  This additional 
67f0: 69 6e 74 65 67 65 72 20 69 73 20 61 6e 20 65 73  integer is an es
6800: 74 69 6d 61 74 65 20 6f 66 0a 20 20 20 20 2a 2a  timate of.    **
6810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
6820: 6f 77 73 20 6d 61 74 63 68 65 64 20 62 79 20 61  ows matched by a
6830: 20 73 74 61 62 62 69 6e 67 20 71 75 65 72 79 20   stabbing query 
6840: 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  on the index usi
6850: 6e 67 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20  ng.    ** a key 
6860: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
6870: 6f 6e 64 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66  onding number of
6880: 20 66 69 65 6c 64 73 2e 20 49 6e 20 6f 74 68 65   fields. In othe
6890: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 2a 2a 20  r words,.    ** 
68a0: 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
68b0: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28 61 2c 62 29  on columns (a,b)
68c0: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
68d0: 73 74 61 74 31 20 76 61 6c 75 65 20 69 73 20 0a  stat1 value is .
68e0: 20 20 20 20 2a 2a 20 22 31 30 30 20 31 30 20 32      ** "100 10 2
68f0: 22 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 65  ", then SQLite e
6900: 73 74 69 6d 61 74 65 73 20 74 68 61 74 3a 0a 20  stimates that:. 
6910: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 2a     **.    **   *
6920: 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   the index conta
6930: 69 6e 73 20 31 30 30 20 72 6f 77 73 2c 0a 20 20  ins 100 rows,.  
6940: 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20    **   * "WHERE 
6950: 61 3d 3f 22 20 6d 61 74 63 68 65 73 20 31 30 20  a=?" matches 10 
6960: 72 6f 77 73 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  rows, and.    **
6970: 20 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 20     * "WHERE a=? 
6980: 41 4e 44 20 62 3d 3f 22 20 6d 61 74 63 68 65 73  AND b=?" matches
6990: 20 32 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 0a   2 rows..    **.
69a0: 20 20 20 20 2a 2a 20 49 66 20 44 20 69 73 20 74      ** If D is t
69b0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74  he count of dist
69c0: 69 6e 63 74 20 76 61 6c 75 65 73 20 61 6e 64 20  inct values and 
69d0: 4b 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  K is the total n
69e0: 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a  umber of .    **
69f0: 20 72 6f 77 73 2c 20 74 68 65 6e 20 65 61 63 68   rows, then each
6a00: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6d   estimate is com
6a10: 70 75 74 65 64 20 61 73 3a 0a 20 20 20 20 2a 2a  puted as:.    **
6a20: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 49  .    **        I
6a30: 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20 20   = (K+D-1)/D.   
6a40: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b   */.    char *z;
6a50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
6a60: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
6a70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
6a80: 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20  p->nCol * 25);. 
6a90: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
6aa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6ab0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
6ac0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
6ad0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6ae0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
6af0: 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65 74 2c  printf(24, zRet,
6b00: 20 22 25 6c 6c 64 22 2c 20 70 2d 3e 6e 52 6f 77   "%lld", p->nRow
6b10: 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52 65 74 20  );.    z = zRet 
6b20: 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
6b30: 30 28 7a 52 65 74 29 3b 0a 20 20 20 20 66 6f 72  0(zRet);.    for
6b40: 28 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c  (i=0; i<(p->nCol
6b50: 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -1); i++){.     
6b60: 20 69 36 34 20 6e 44 69 73 74 69 6e 63 74 20 3d   i64 nDistinct =
6b70: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c   p->current.anDL
6b80: 74 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20 20 20  t[i] + 1;.      
6b90: 69 36 34 20 69 56 61 6c 20 3d 20 28 70 2d 3e 6e  i64 iVal = (p->n
6ba0: 52 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63 74 20  Row + nDistinct 
6bb0: 2d 20 31 29 20 2f 20 6e 44 69 73 74 69 6e 63 74  - 1) / nDistinct
6bc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6bd0: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20  snprintf(24, z, 
6be0: 22 20 25 6c 6c 64 22 2c 20 69 56 61 6c 29 3b 0a  " %lld", iVal);.
6bf0: 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
6c00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
6c10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6c20: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
6c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
6c40: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20  ert( z[0]=='\0' 
6c50: 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a 20 20  && z>zRet );..  
6c60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6c70: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
6c80: 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Ret, -1, sqlite3
6c90: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69 66 64  _free);.  }.#ifd
6ca0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6cb0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6cc0: 20 20 65 6c 73 65 20 69 66 28 20 65 43 61 6c 6c    else if( eCall
6cd0: 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44  ==STAT_GET_ROWID
6ce0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
6cf0: 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  Get<0 ){.      s
6d00: 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75  amplePushPreviou
6d10: 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  s(p, 0);.      p
6d20: 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20 20 20  ->iGet = 0;.    
6d30: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47 65  }.    if( p->iGe
6d40: 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  t<p->nSample ){.
6d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6d60: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6d70: 78 74 2c 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74  xt, p->a[p->iGet
6d80: 5d 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  ].iRowid);.    }
6d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
6da0: 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b  owcnt *aCnt = 0;
6db0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
6dc0: 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65  >iGet<p->nSample
6dd0: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
6de0: 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  eCall ){.      c
6df0: 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ase STAT_GET_NEQ
6e00: 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70  :  aCnt = p->a[p
6e10: 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20 62 72  ->iGet].anEq; br
6e20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
6e30: 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20 20 61  STAT_GET_NLT:  a
6e40: 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47  Cnt = p->a[p->iG
6e50: 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b  et].anLt; break;
6e60: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6e70: 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74 20 3d  {.        aCnt =
6e80: 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61   p->a[p->iGet].a
6e90: 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20 20 70  nDLt; .        p
6ea0: 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20 20 20  ->iGet++;.      
6eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6ec0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
6ed0: 49 73 53 74 61 74 33 20 29 7b 0a 20 20 20 20 20  IsStat3 ){.     
6ee0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6ef0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  int64(context, (
6f00: 69 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a 20 20  i64)aCnt[0]);.  
6f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6f20: 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69  har *zRet = sqli
6f30: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d  te3MallocZero(p-
6f40: 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20 20 20  >nCol * 25);.   
6f50: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
6f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6f70: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
6f80: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
6f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6fa0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
6fb0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65     char *z = zRe
6fc0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
6fd0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
6fe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
6ff0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7000: 32 34 2c 20 7a 2c 20 22 25 6c 6c 64 20 22 2c 20  24, z, "%lld ", 
7010: 61 43 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aCnt[i]);.      
7020: 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
7030: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
7040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
7050: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30  ssert( z[0]=='\0
7060: 27 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 20  ' && z>zRet );. 
7070: 20 20 20 20 20 20 20 7a 5b 2d 31 5d 20 3d 20 27         z[-1] = '
7080: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \0';.        sql
7090: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
70a0: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20  (context, zRet, 
70b0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
70c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
70d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
70e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
70f0: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 7d  T3_OR_STAT4 */.}
7100: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75  .static const Fu
7110: 6e 63 44 65 66 20 73 74 61 74 47 65 74 46 75 6e  ncDef statGetFun
7120: 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49 73 53  cdef = {.  1+IsS
7130: 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e  tat34,      /* n
7140: 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  Arg */.  SQLITE_
7150: 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e  UTF8,     /* fun
7160: 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20  cFlags */.  0,  
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7180: 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30  pUserData */.  0
7190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71a0: 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74  /* pNext */.  st
71b0: 61 74 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f  atGet,         /
71c0: 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xFunc */.  0, 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20   xStep */.  0,  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7200: 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22  xFinalize */.  "
7210: 73 74 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20  stat_get",      
7220: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c  /* zName */.  0,
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7240: 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 30 20 20  * pHash */.  0  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7260: 20 70 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a   pDestructor */.
7270: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
7280: 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62 65  callStatGet(Vdbe
7290: 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61 74   *v, int regStat
72a0: 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20 69  4, int iParam, i
72b0: 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61 73  nt regOut){.  as
72c0: 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72 65  sert( regOut!=re
72d0: 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75 74  gStat4 && regOut
72e0: 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b 0a  !=regStat4+1 );.
72f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7300: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
7310: 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62  AT4.  sqlite3Vdb
7320: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7330: 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72  teger, iParam, r
7340: 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 73  egStat4+1);.#els
7350: 65 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 72  e.  assert( iPar
7360: 61 6d 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41  am==STAT_GET_STA
7370: 54 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  T1 );.#endif.  s
7380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7390: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
73a0: 20 30 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65   0, regStat4, re
73b0: 67 4f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  gOut);.  sqlite3
73c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
73d0: 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  -1, (char*)&stat
73e0: 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46  GetFuncdef, P4_F
73f0: 55 4e 43 44 45 46 29 3b 0a 20 20 73 71 6c 69 74  UNCDEF);.  sqlit
7400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7410: 2c 20 31 20 2b 20 49 73 53 74 61 74 33 34 29 3b  , 1 + IsStat34);
7420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
7430: 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 6e  te code to do an
7440: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6c 6c   analysis of all
7450: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
7460: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
7470: 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  ngle table..*/.s
7480: 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
7490: 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20 20 50 61  zeOneTable(.  Pa
74a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
74b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
74c0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
74d0: 62 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b,     /* Table 
74e0: 77 68 6f 73 65 20 69 6e 64 69 63 65 73 20 61 72  whose indices ar
74f0: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
7500: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6e   */.  Index *pOn
7510: 6c 79 49 64 78 2c 20 2f 2a 20 49 66 20 6e 6f 74  lyIdx, /* If not
7520: 20 4e 55 4c 4c 2c 20 6f 6e 6c 79 20 61 6e 61 6c   NULL, only anal
7530: 79 7a 65 20 74 68 69 73 20 6f 6e 65 20 69 6e 64  yze this one ind
7540: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  ex */.  int iSta
7550: 74 43 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64 65  tCur,    /* Inde
7560: 78 20 6f 66 20 56 64 62 65 43 75 72 73 6f 72 20  x of VdbeCursor 
7570: 74 68 61 74 20 77 72 69 74 65 73 20 74 68 65 20  that writes the 
7580: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
7590: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d  le */.  int iMem
75a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69  ,        /* Avai
75b0: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  lable memory loc
75c0: 61 74 69 6f 6e 73 20 62 65 67 69 6e 20 68 65 72  ations begin her
75d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  e */.  int iTab 
75e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
75f0: 61 76 61 69 6c 61 62 6c 65 20 63 75 72 73 6f 72  available cursor
7600: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
7610: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7620: 62 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  b;    /* Databas
7630: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e  e handle */.  In
7640: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
7650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
7660: 20 69 6e 64 65 78 20 74 6f 20 62 65 69 6e 67 20   index to being 
7670: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e  analyzed */.  in
7680: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
7690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
76a0: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 69 6e 64  rsor open on ind
76b0: 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ex being analyze
76c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
76d0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
76e0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
76f0: 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  sor */.  Vdbe *v
7700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7710: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
7720: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
7730: 6e 67 20 62 75 69 6c 74 20 75 70 20 2a 2f 0a 20  ng built up */. 
7740: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7760: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7770: 0a 20 20 69 6e 74 20 6a 5a 65 72 6f 52 6f 77 73  .  int jZeroRows
7780: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
7790: 2f 2a 20 4a 75 6d 70 20 66 72 6f 6d 20 68 65 72  /* Jump from her
77a0: 65 20 69 66 20 6e 75 6d 62 65 72 20 6f 66 20 72  e if number of r
77b0: 6f 77 73 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  ows is zero */. 
77c0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77e0: 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
77f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
7800: 61 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 54  ab */.  u8 needT
7810: 61 62 6c 65 43 6e 74 20 3d 20 31 3b 20 20 20 20  ableCnt = 1;    
7820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7830: 63 6f 75 6e 74 20 74 68 65 20 74 61 62 6c 65 20  count the table 
7840: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 52  */.  int regNewR
7850: 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  owid = iMem++;  
7860: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
7870: 68 65 20 69 6e 73 65 72 74 65 64 20 72 65 63 6f  he inserted reco
7880: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  rd */.  int regS
7890: 74 61 74 34 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  tat4 = iMem++;  
78a0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
78b0: 20 74 6f 20 68 6f 6c 64 20 53 74 61 74 34 41 63   to hold Stat4Ac
78c0: 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  cum object */.  
78d0: 69 6e 74 20 72 65 67 43 68 6e 67 20 3d 20 69 4d  int regChng = iM
78e0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20  em++;        /* 
78f0: 49 6e 64 65 78 20 6f 66 20 63 68 61 6e 67 65 64  Index of changed
7900: 20 69 6e 64 65 78 20 66 69 65 6c 64 20 2a 2f 0a   index field */.
7910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7920: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
7930: 41 54 34 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  AT4.  int regRow
7940: 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  id = iMem++;    
7950: 20 20 20 2f 2a 20 52 6f 77 69 64 20 61 72 67 75     /* Rowid argu
7960: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 73  ment passed to s
7970: 74 61 74 5f 70 75 73 68 28 29 20 2a 2f 0a 23 65  tat_push() */.#e
7980: 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 67 54 65  ndif.  int regTe
7990: 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  mp = iMem++;    
79a0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
79b0: 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
79c0: 0a 20 20 69 6e 74 20 72 65 67 54 61 62 6e 61 6d  .  int regTabnam
79d0: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
79e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
79f0: 61 69 6e 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d  aining table nam
7a00: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64  e */.  int regId
7a10: 78 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20  xname = iMem++; 
7a20: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
7a30: 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 64 65 78  containing index
7a40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 72   name */.  int r
7a50: 65 67 53 74 61 74 31 20 3d 20 69 4d 65 6d 2b 2b  egStat1 = iMem++
7a60: 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65  ;       /* Value
7a70: 20 66 6f 72 20 74 68 65 20 73 74 61 74 20 63 6f   for the stat co
7a80: 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74 65 5f 73  lumn of sqlite_s
7a90: 74 61 74 31 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tat1 */.  int re
7aa0: 67 50 72 65 76 20 3d 20 69 4d 65 6d 3b 20 20 20  gPrev = iMem;   
7ab0: 20 20 20 20 20 20 20 2f 2a 20 4d 55 53 54 20 42         /* MUST B
7ac0: 45 20 4c 41 53 54 20 28 73 65 65 20 62 65 6c 6f  E LAST (see belo
7ad0: 77 29 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d  w) */..  pParse-
7ae0: 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72  >nMem = MAX(pPar
7af0: 73 65 2d 3e 6e 4d 65 6d 2c 20 69 4d 65 6d 29 3b  se->nMem, iMem);
7b00: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
7b10: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
7b20: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 4e 45 56   if( v==0 || NEV
7b30: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20  ER(pTab==0) ){. 
7b40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7b50: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
7b60: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  =0 ){.    /* Do 
7b70: 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61 74 69  not gather stati
7b80: 73 74 69 63 73 20 6f 6e 20 76 69 65 77 73 20 6f  stics on views o
7b90: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
7ba0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
7bb0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
7bc0: 33 5f 73 74 72 6e 69 63 6d 70 28 70 54 61 62 2d  3_strnicmp(pTab-
7bd0: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
7be0: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
7bf0: 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72  /* Do not gather
7c00: 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73   statistics on s
7c10: 79 73 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a  ystem tables */.
7c20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c40: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
7c50: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69  texes(db) );.  i
7c60: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
7c70: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
7c80: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7c90: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29  assert( iDb>=0 )
7ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7cb0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7cc0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7cd0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7ce0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
7cf0: 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
7d00: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7d10: 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  e, SQLITE_ANALYZ
7d20: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
7d30: 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
7d40: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
7d50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d60: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73  .#endif..  /* Es
7d70: 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 2d 6c  tablish a read-l
7d80: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
7d90: 20 61 74 20 74 68 65 20 73 68 61 72 65 64 2d 63   at the shared-c
7da0: 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a  ache level. .  *
7db0: 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
7dc0: 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  ly cursor on the
7dd0: 20 74 61 62 6c 65 2e 20 41 6c 73 6f 20 61 6c 6c   table. Also all
7de0: 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 20 6e  ocate a cursor n
7df0: 75 6d 62 65 72 0a 20 20 2a 2a 20 74 6f 20 75 73  umber.  ** to us
7e00: 65 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 69  e for scanning i
7e10: 6e 64 65 78 65 73 20 28 69 49 64 78 43 75 72 29  ndexes (iIdxCur)
7e20: 2e 20 4e 6f 20 69 6e 64 65 78 20 63 75 72 73 6f  . No index curso
7e30: 72 20 69 73 20 6f 70 65 6e 65 64 20 61 74 0a 20  r is opened at. 
7e40: 20 2a 2a 20 74 68 69 73 20 74 69 6d 65 20 74 68   ** this time th
7e50: 6f 75 67 68 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ough.  */.  sqli
7e60: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
7e70: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
7e80: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
7e90: 4e 61 6d 65 29 3b 0a 20 20 69 54 61 62 43 75 72  Name);.  iTabCur
7ea0: 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 69 49 64   = iTab++;.  iId
7eb0: 78 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20  xCur = iTab++;. 
7ec0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
7ed0: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  MAX(pParse->nTab
7ee0: 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
7ef0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
7f00: 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62  se, iTabCur, iDb
7f10: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
7f20: 65 61 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ead);.  sqlite3V
7f30: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
7f40: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54  String8, 0, regT
7f50: 61 62 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62 2d  abname, 0, pTab-
7f60: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 66  >zName, 0);..  f
7f70: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
7f80: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
7f90: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
7fa0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
7fd0: 6c 75 6d 6e 73 20 69 6e 64 65 78 65 64 20 62 79  lumns indexed by
7fe0: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 4b 65 79   pIdx */.    Key
7ff0: 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
8000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
8010: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8020: 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
8030: 69 6e 74 20 2a 61 47 6f 74 6f 43 68 6e 67 3b 20  int *aGotoChng; 
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8050: 20 41 72 72 61 79 20 6f 66 20 6a 75 6d 70 20 69   Array of jump i
8060: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65  nstruction addre
8070: 73 73 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sses */.    int 
8080: 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20 20 20  addrRewind;     
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
80a0: 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65 77 69  ress of "OP_Rewi
80b0: 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f 0a 20  nd iIdxCur" */. 
80c0: 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 43     int addrGotoC
80d0: 68 6e 67 30 3b 20 20 20 20 20 20 20 20 20 20 20  hng0;           
80e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22   /* Address of "
80f0: 47 6f 74 6f 20 61 64 64 72 5f 63 68 6e 67 5f 30  Goto addr_chng_0
8100: 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  " */.    int add
8110: 72 4e 65 78 74 52 6f 77 3b 20 20 20 20 20 20 20  rNextRow;       
8120: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8130: 73 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77 3a 22  s of "next_row:"
8140: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f 6e   */..    if( pOn
8150: 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c 79 49 64  lyIdx && pOnlyId
8160: 78 21 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e  x!=pIdx ) contin
8170: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ue;.    if( pIdx
8180: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
8190: 3d 30 20 29 20 6e 65 65 64 54 61 62 6c 65 43 6e  =0 ) needTableCn
81a0: 74 20 3d 20 30 3b 0a 20 20 20 20 56 64 62 65 4e  t = 0;.    VdbeN
81b0: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
81c0: 42 65 67 69 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Begin analysis o
81d0: 66 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  f %s", pIdx->zNa
81e0: 6d 65 29 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  me));.    nCol =
81f0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
8200: 20 20 20 20 61 47 6f 74 6f 43 68 6e 67 20 3d 20      aGotoChng = 
8210: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8220: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  aw(db, sizeof(in
8230: 74 29 2a 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20  t)*(nCol+1));.  
8240: 20 20 69 66 28 20 61 47 6f 74 6f 43 68 6e 67 3d    if( aGotoChng=
8250: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8260: 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
8270: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
8280: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 0a 20 20  arse, pIdx);..  
8290: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
82a0: 65 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  e register conta
82b0: 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
82c0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  name. */.    sql
82d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82e0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
82f0: 20 72 65 67 49 64 78 6e 61 6d 65 2c 20 30 2c 20   regIdxname, 0, 
8300: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pIdx->zName, 0);
8310: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
8320: 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20  Pseudo-code for 
8330: 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20  loop that calls 
8340: 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20  stat_push():.   
8350: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77   **.    **   Rew
8360: 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20  ind csr.    **  
8370: 20 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74   if eof(csr) got
8380: 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20  o end_of_scan;. 
8390: 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20     **   regChng 
83a0: 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74  = 0.    **   got
83b0: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20  o chng_addr_0;. 
83c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65     **.    **  ne
83d0: 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20  xt_row:.    **  
83e0: 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20   regChng = 0.   
83f0: 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29   **   if( idx(0)
8400: 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29   != regPrev(0) )
8410: 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f   goto chng_addr_
8420: 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68  0.    **   regCh
8430: 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20  ng = 1.    **   
8440: 69 66 28 20 69 64 78 28 31 29 20 21 3d 20 72 65  if( idx(1) != re
8450: 67 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20  gPrev(1) ) goto 
8460: 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20  chng_addr_1.    
8470: 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  **   ....    ** 
8480: 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20    regChng = N.  
8490: 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67    **   goto chng
84a0: 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20  _addr_N.    **. 
84b0: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
84c0: 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _0:.    **   reg
84d0: 50 72 65 76 28 30 29 20 3d 20 69 64 78 28 30 29  Prev(0) = idx(0)
84e0: 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64  .    **  chng_ad
84f0: 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72  dr_1:.    **   r
8500: 65 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28  egPrev(1) = idx(
8510: 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20  1).    **  .... 
8520: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63 68     **.    **  ch
8530: 6e 67 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a  ng_addr_N:.    *
8540: 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69  *   regRowid = i
8550: 64 78 28 72 6f 77 69 64 29 0a 20 20 20 20 2a 2a  dx(rowid).    **
8560: 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20     stat_push(P, 
8570: 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69  regChng, regRowi
8580: 64 29 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74  d).    **   Next
8590: 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66   csr.    **   if
85a0: 20 21 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20   !eof(csr) goto 
85b0: 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a  next_row;.    **
85c0: 0a 20 20 20 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f  .    **  end_of_
85d0: 73 63 61 6e 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20  scan:.    */..  
85e0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
85f0: 68 65 72 65 20 61 72 65 20 65 6e 6f 75 67 68 20  here are enough 
8600: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6c 6c  memory cells all
8610: 6f 63 61 74 65 64 20 74 6f 20 61 63 63 6f 6d 6d  ocated to accomm
8620: 6f 64 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  odate .    ** th
8630: 65 20 72 65 67 50 72 65 76 20 61 72 72 61 79 20  e regPrev array 
8640: 61 6e 64 20 61 20 74 72 61 69 6c 69 6e 67 20 72  and a trailing r
8650: 6f 77 69 64 20 28 74 68 65 20 72 6f 77 69 64 20  owid (the rowid 
8660: 73 6c 6f 74 20 69 73 20 72 65 71 75 69 72 65 64  slot is required
8670: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 62 75 69  .    ** when bui
8680: 6c 64 69 6e 67 20 61 20 72 65 63 6f 72 64 20 74  lding a record t
8690: 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  o insert into th
86a0: 65 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  e sample column 
86b0: 6f 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  of .    ** the s
86c0: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
86d0: 65 2e 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  e.  */.    pPars
86e0: 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50  e->nMem = MAX(pP
86f0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50  arse->nMem, regP
8700: 72 65 76 2b 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20  rev+nCol);..    
8710: 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
8720: 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  nly cursor on th
8730: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  e index being an
8740: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61  alyzed. */.    a
8750: 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69  ssert( iDb==sqli
8760: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
8770: 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  (db, pIdx->pSche
8780: 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ma) );.    sqlit
8790: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
87a0: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
87b0: 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  xCur, pIdx->tnum
87c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
87d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
87e0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
87f0: 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
8800: 41 4e 44 4f 46 46 29 3b 20 0a 20 20 20 20 56 64  ANDOFF); .    Vd
8810: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
8820: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
8830: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  );..    /* Invok
8840: 65 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28  e the stat_init(
8850: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  ) function. The 
8860: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20  arguments are:. 
8870: 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20     ** .    **   
8880: 20 28 31 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (1) the number 
8890: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
88a0: 65 20 69 6e 64 65 78 20 69 6e 63 6c 75 64 69 6e  e index includin
88b0: 67 20 74 68 65 20 72 6f 77 69 64 2c 0a 20 20 20  g the rowid,.   
88c0: 20 2a 2a 20 20 20 20 28 32 29 20 74 68 65 20 6e   **    (2) the n
88d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
88e0: 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
88f0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
8900: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
8910: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53   only used for S
8920: 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 0a 20  TAT3 and STAT4. 
8930: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
8940: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
8950: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
8960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8970: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64  v, OP_Count, iId
8980: 78 43 75 72 2c 20 72 65 67 53 74 61 74 34 2b 32  xCur, regStat4+2
8990: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
89a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
89b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
89c0: 43 6f 6c 2b 31 2c 20 72 65 67 53 74 61 74 34 2b  Col+1, regStat4+
89d0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
89e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
89f0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 72 65 67  Function, 0, reg
8a00: 53 74 61 74 34 2b 31 2c 20 72 65 67 53 74 61 74  Stat4+1, regStat
8a10: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
8a20: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
8a30: 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 49  1, (char*)&statI
8a40: 6e 69 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46  nitFuncdef, P4_F
8a50: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
8a60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8a70: 28 76 2c 20 31 2b 49 73 53 74 61 74 33 34 29 3b  (v, 1+IsStat34);
8a80: 0a 0a 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  ..    /* Impleme
8a90: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
8aa0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a  ollowing:.    **
8ab0: 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64  .    **   Rewind
8ac0: 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66   csr.    **   if
8ad0: 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 65   eof(csr) goto e
8ae0: 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20 20  nd_of_scan;.    
8af0: 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30  **   regChng = 0
8b00: 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 6e  .    **   goto n
8b10: 65 78 74 5f 70 75 73 68 5f 30 3b 0a 20 20 20 20  ext_push_0;.    
8b20: 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64  **.    */.    ad
8b30: 64 72 52 65 77 69 6e 64 20 3d 20 73 71 6c 69 74  drRewind = sqlit
8b40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8b50: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43  OP_Rewind, iIdxC
8b60: 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
8b70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b80: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
8b90: 43 68 6e 67 29 3b 0a 20 20 20 20 61 64 64 72 47  Chng);.    addrG
8ba0: 6f 74 6f 43 68 6e 67 30 20 3d 20 73 71 6c 69 74  otoChng0 = sqlit
8bb0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8bc0: 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20 20 2f  OP_Goto);..    /
8bd0: 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72  *.    **  next_r
8be0: 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  ow:.    **   reg
8bf0: 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20  Chng = 0.    ** 
8c00: 20 20 69 66 28 20 69 64 78 28 30 29 20 21 3d 20    if( idx(0) != 
8c10: 72 65 67 50 72 65 76 28 30 29 20 29 20 67 6f 74  regPrev(0) ) got
8c20: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20  o chng_addr_0.  
8c30: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
8c40: 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20   1.    **   if( 
8c50: 69 64 78 28 31 29 20 21 3d 20 72 65 67 50 72 65  idx(1) != regPre
8c60: 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68 6e 67  v(1) ) goto chng
8c70: 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a 20 20  _addr_1.    **  
8c80: 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 72 65   ....    **   re
8c90: 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20 2a 2a  gChng = N.    **
8ca0: 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64     goto chng_add
8cb0: 72 5f 4e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  r_N.    */.    a
8cc0: 64 64 72 4e 65 78 74 52 6f 77 20 3d 20 73 71 6c  ddrNextRow = sql
8cd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
8ce0: 64 64 72 28 76 29 3b 0a 20 20 20 20 66 6f 72 28  ddr(v);.    for(
8cf0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
8d00: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
8d10: 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73 71  Coll = (char*)sq
8d20: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
8d30: 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  eq(pParse, pIdx-
8d40: 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  >azColl[i]);.   
8d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d60: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8d70: 65 72 2c 20 69 2c 20 72 65 67 43 68 6e 67 29 3b  er, i, regChng);
8d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8d90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
8da0: 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
8db0: 69 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20  i, regTemp);.   
8dc0: 20 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20     aGotoChng[i] 
8dd0: 3d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  = .      sqlite3
8de0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8df0: 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c  _Ne, regTemp, 0,
8e00: 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43 6f 6c   regPrev+i, pCol
8e10: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
8e40: 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
8e50: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
8e60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8e70: 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 2c 20 72 65  nteger, nCol, re
8e80: 67 43 68 6e 67 29 3b 0a 20 20 20 20 61 47 6f 74  gChng);.    aGot
8e90: 6f 43 68 6e 67 5b 6e 43 6f 6c 5d 20 3d 20 73 71  oChng[nCol] = sq
8ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8eb0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20  v, OP_Goto);..  
8ec0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e    /*.    **  chn
8ed0: 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20 2a 2a  g_addr_0:.    **
8ee0: 20 20 20 72 65 67 50 72 65 76 28 30 29 20 3d 20     regPrev(0) = 
8ef0: 69 64 78 28 30 29 0a 20 20 20 20 2a 2a 20 20 63  idx(0).    **  c
8f00: 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20  hng_addr_1:.    
8f10: 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31 29 20  **   regPrev(1) 
8f20: 3d 20 69 64 78 28 31 29 0a 20 20 20 20 2a 2a 20  = idx(1).    ** 
8f30: 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   ....    */.    
8f40: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8f50: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 43  ere(v, addrGotoC
8f60: 68 6e 67 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  hng0);.    for(i
8f70: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
8f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8f90: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8fa0: 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a 20 20  GotoChng[i]);.  
8fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
8fd0: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20  mn, iIdxCur, i, 
8fe0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
8ff0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
9000: 20 20 63 68 6e 67 5f 61 64 64 72 5f 4e 3a 0a 20    chng_addr_N:. 
9010: 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64     **   regRowid
9020: 20 3d 20 69 64 78 28 72 6f 77 69 64 29 20 20 20   = idx(rowid)   
9030: 20 20 20 20 20 20 20 20 20 2f 2f 20 53 54 41 54           // STAT
9040: 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  34 only.    **  
9050: 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65   stat_push(P, re
9060: 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29  gChng, regRowid)
9070: 20 20 2f 2f 20 33 72 64 20 70 61 72 61 6d 65 74    // 3rd paramet
9080: 65 72 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20  er STAT34 only. 
9090: 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72     **   Next csr
90a0: 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f  .    **   if !eo
90b0: 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74  f(csr) goto next
90c0: 5f 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a 20 20 20  _row;.    */.   
90d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
90e0: 48 65 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e  Here(v, aGotoChn
90f0: 67 5b 6e 43 6f 6c 5d 29 3b 0a 23 69 66 64 65 66  g[nCol]);.#ifdef
9100: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9110: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
9120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9130: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
9140: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  id, iIdxCur, reg
9150: 52 6f 77 69 64 29 3b 0a 20 20 20 20 61 73 73 65  Rowid);.    asse
9160: 72 74 28 20 72 65 67 52 6f 77 69 64 3d 3d 28 72  rt( regRowid==(r
9170: 65 67 53 74 61 74 34 2b 32 29 20 29 3b 0a 23 65  egStat4+2) );.#e
9180: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
9190: 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67 53 74   regChng==(regSt
91a0: 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20 73 71  at4+1) );.    sq
91b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
91c0: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
91d0: 31 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65 67  1, regStat4, reg
91e0: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
91f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
9200: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74  , -1, (char*)&st
9210: 61 74 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50  atPushFuncdef, P
9220: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
9230: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9240: 65 50 35 28 76 2c 20 32 2b 49 73 53 74 61 74 33  eP5(v, 2+IsStat3
9250: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
9260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9270: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 61  Next, iIdxCur, a
9280: 64 64 72 4e 65 78 74 52 6f 77 29 3b 0a 0a 20 20  ddrNextRow);..  
9290: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
92a0: 72 79 20 74 6f 20 74 68 65 20 73 74 61 74 31 20  ry to the stat1 
92b0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 61  table. */.    ca
92c0: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
92d0: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
92e0: 53 54 41 54 31 2c 20 72 65 67 53 74 61 74 31 29  STAT1, regStat1)
92f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9300: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
9310: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62  keRecord, regTab
9320: 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70  name, 3, regTemp
9330: 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20 20 20  , "aaa", 0);.   
9340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9350: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
9360: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
9370: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  NewRowid);.    s
9380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9390: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
93a0: 53 74 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70  StatCur, regTemp
93b0: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
93c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
93d0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
93e0: 47 5f 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20  G_APPEND);..    
93f0: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 69  /* Add the entri
9400: 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 33 20  es to the stat3 
9410: 6f 72 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  or stat4 table. 
9420: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9430: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
9440: 5f 53 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20  _STAT4.    {.   
9450: 20 20 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72     int regEq = r
9460: 65 67 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69  egStat1;.      i
9470: 6e 74 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74  nt regLt = regSt
9480: 61 74 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  at1+1;.      int
9490: 20 72 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61   regDLt = regSta
94a0: 74 31 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+2;.      int 
94b0: 72 65 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53  regSample = regS
94c0: 74 61 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e  tat1+3;.      in
94d0: 74 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74  t regCol = regSt
94e0: 61 74 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74  at1+4;.      int
94f0: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20   regSampleRowid 
9500: 3d 20 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b  = regCol + nCol;
9510: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e  .      int addrN
9520: 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  ext;.      int a
9530: 64 64 72 49 73 4e 75 6c 6c 3b 0a 0a 20 20 20 20  ddrIsNull;..    
9540: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9550: 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65   MAX(pParse->nMe
9560: 6d 2c 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 2b 31  m, regCol+nCol+1
9570: 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 4e 65  );..      addrNe
9580: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
9590: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
95a0: 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65        callStatGe
95b0: 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53  t(v, regStat4, S
95c0: 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72  TAT_GET_ROWID, r
95d0: 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a  egSampleRowid);.
95e0: 20 20 20 20 20 20 61 64 64 72 49 73 4e 75 6c 6c        addrIsNull
95f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9600: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
9610: 6c 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69  l, regSampleRowi
9620: 64 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74  d);.      callSt
9630: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
9640: 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 2c  4, STAT_GET_NEQ,
9650: 20 72 65 67 45 71 29 3b 0a 20 20 20 20 20 20 63   regEq);.      c
9660: 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65  allStatGet(v, re
9670: 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54  gStat4, STAT_GET
9680: 5f 4e 4c 54 2c 20 72 65 67 4c 74 29 3b 0a 20 20  _NLT, regLt);.  
9690: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
96a0: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
96b0: 54 5f 47 45 54 5f 4e 44 4c 54 2c 20 72 65 67 44  T_GET_NDLT, regD
96c0: 4c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Lt);.      sqlit
96d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
96e0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 54  OP_NotExists, iT
96f0: 61 62 43 75 72 2c 20 61 64 64 72 4e 65 78 74 2c  abCur, addrNext,
9700: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29   regSampleRowid)
9710: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9720: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
9730: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9740: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
9750: 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
9760: 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
9790: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72  ->aiColumn[0], r
97a0: 65 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65  egSample);.#else
97b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
97c0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
97d0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
97e0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
97f0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
9800: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
9810: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
9820: 54 61 62 2c 20 69 54 61 62 43 75 72 2c 20 69 43  Tab, iTabCur, iC
9830: 6f 6c 2c 20 72 65 67 43 6f 6c 2b 69 29 3b 0a 20  ol, regCol+i);. 
9840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9860: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9870: 20 72 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2b 31 2c   regCol, nCol+1,
9880: 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6e   regSample);.#en
9890: 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
98a0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
98b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
98c0: 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67  gTabname, 6, reg
98d0: 54 65 6d 70 2c 20 22 62 62 62 62 62 62 22 2c 20  Temp, "bbbbbb", 
98e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
98f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9900: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
9910: 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f  tCur+1, regNewRo
9920: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
9930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9940: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
9950: 74 43 75 72 2b 31 2c 20 72 65 67 54 65 6d 70 2c  tCur+1, regTemp,
9960: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
9970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
9990: 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74 29 3b  o, 0, addrNext);
99a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
99b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
99c0: 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  drIsNull);.    }
99d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
99e0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
99f0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 20 20  R_STAT4 */..    
9a00: 2f 2a 20 45 6e 64 20 6f 66 20 61 6e 61 6c 79 73  /* End of analys
9a10: 69 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  is */.    sqlite
9a20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9a30: 20 61 64 64 72 52 65 77 69 6e 64 29 3b 0a 20 20   addrRewind);.  
9a40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9a50: 64 62 2c 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a  db, aGotoChng);.
9a60: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74    }...  /* Creat
9a70: 65 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74  e a single sqlit
9a80: 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f  e_stat1 entry co
9a90: 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73  ntaining NULL as
9aa0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
9ab0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77  name and the row
9ac0: 20 63 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f   count as the co
9ad0: 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntent..  */.  if
9ae0: 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26  ( pOnlyIdx==0 &&
9af0: 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b   needTableCnt ){
9b00: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
9b10: 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d  ((v, "%s", pTab-
9b20: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
9b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9b40: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61  v, OP_Count, iTa
9b50: 62 43 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b  bCur, regStat1);
9b60: 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d  .    jZeroRows =
9b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b80: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
9b90: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 73  regStat1);.    s
9ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9bb0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
9bc0: 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20 20  regIdxname);.   
9bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9be0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
9bf0: 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  ord, regTabname,
9c00: 20 33 2c 20 72 65 67 54 65 6d 70 2c 20 22 61 61   3, regTemp, "aa
9c10: 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  a", 0);.    sqli
9c20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9c30: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53   OP_NewRowid, iS
9c40: 74 61 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f  tatCur, regNewRo
9c50: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
9c60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9c70: 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43  P_Insert, iStatC
9c80: 75 72 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67  ur, regTemp, reg
9c90: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  NewRowid);.    s
9ca0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9cb0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
9cc0: 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  END);.    sqlite
9cd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9ce0: 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d   jZeroRows);.  }
9cf0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
9d00: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
9d10: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73  ll cause the mos
9d20: 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61  t recent index a
9d30: 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65  nalysis to.** be
9d40: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74   loaded into int
9d50: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
9d60: 73 20 77 68 65 72 65 20 69 73 20 63 61 6e 20 62  s where is can b
9d70: 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  e used..*/.stati
9d80: 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79  c void loadAnaly
9d90: 73 69 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  sis(Parse *pPars
9da0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
9db0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9dc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9dd0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
9de0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9df0: 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c  1(v, OP_LoadAnal
9e00: 79 73 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  ysis, iDb);.  }.
9e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
9e20: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
9e30: 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   do an analysis 
9e40: 6f 66 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74  of an entire dat
9e50: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
9e60: 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61  void analyzeData
9e70: 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
9e80: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
9e90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9ea0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65  arse->db;.  Sche
9eb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
9ec0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
9ed0: 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61  ma;    /* Schema
9ee0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62   of database iDb
9ef0: 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
9f00: 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75  k;.  int iStatCu
9f10: 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  r;.  int iMem;. 
9f20: 20 69 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73 71   int iTab;..  sq
9f30: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
9f40: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
9f50: 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61   0, iDb);.  iSta
9f60: 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tCur = pParse->n
9f70: 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Tab;.  pParse->n
9f80: 54 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e  Tab += 3;.  open
9f90: 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65  StatTable(pParse
9fa0: 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c  , iDb, iStatCur,
9fb0: 20 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d   0, 0);.  iMem =
9fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
9fd0: 0a 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  .  iTab = pParse
9fe0: 2d 3e 6e 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->nTab;.  assert
9ff0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
a000: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
a010: 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d  , 0) );.  for(k=
a020: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a030: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
a040: 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  h); k; k=sqliteH
a050: 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
a060: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28   Table *pTab = (
a070: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
a080: 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e  hData(k);.    an
a090: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50  alyzeOneTable(pP
a0a0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69  arse, pTab, 0, i
a0b0: 53 74 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69  StatCur, iMem, i
a0c0: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64  Tab);.  }.  load
a0d0: 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c  Analysis(pParse,
a0e0: 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
a0f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
a100: 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e  at will do an an
a110: 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67  alysis of a sing
a120: 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61  le table in.** a
a130: 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 70   database.  If p
a140: 4f 6e 6c 79 49 64 78 20 69 73 20 6e 6f 74 20 4e  OnlyIdx is not N
a150: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ULL then it is a
a160: 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a   single index.**
a170: 20 69 6e 20 70 54 61 62 20 74 68 61 74 20 73 68   in pTab that sh
a180: 6f 75 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65 64  ould be analyzed
a190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a1a0: 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61   analyzeTable(Pa
a1b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
a1c0: 6c 65 20 2a 70 54 61 62 2c 20 49 6e 64 65 78 20  le *pTab, Index 
a1d0: 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e  *pOnlyIdx){.  in
a1e0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74  t iDb;.  int iSt
a1f0: 61 74 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74  atCur;..  assert
a200: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
a210: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
a220: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
a230: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29  es(pParse->db) )
a240: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
a250: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
a260: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
a270: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
a280: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
a290: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
a2a0: 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74  0, iDb);.  iStat
a2b0: 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
a2c0: 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ab;.  pParse->nT
a2d0: 61 62 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70  ab += 3;.  if( p
a2e0: 4f 6e 6c 79 49 64 78 20 29 7b 0a 20 20 20 20 6f  OnlyIdx ){.    o
a2f0: 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61  penStatTable(pPa
a300: 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43  rse, iDb, iStatC
a310: 75 72 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e  ur, pOnlyIdx->zN
a320: 61 6d 65 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d  ame, "idx");.  }
a330: 65 6c 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74  else{.    openSt
a340: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
a350: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70  iDb, iStatCur, p
a360: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c  Tab->zName, "tbl
a370: 22 29 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a  ");.  }.  analyz
a380: 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65  eOneTable(pParse
a390: 2c 20 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78  , pTab, pOnlyIdx
a3a0: 2c 20 69 53 74 61 74 43 75 72 2c 70 50 61 72 73  , iStatCur,pPars
a3b0: 65 2d 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65  e->nMem+1,pParse
a3c0: 2d 3e 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41  ->nTab);.  loadA
a3d0: 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20  nalysis(pParse, 
a3e0: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iDb);.}../*.** G
a3f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
a400: 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
a410: 6d 61 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65  mand.  The parse
a420: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
a430: 74 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20  tine.** when it 
a440: 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e  recognizes an AN
a450: 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
a460: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  *.**        ANAL
a470: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20  YZE             
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
a490: 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 1.**        AN
a4a0: 41 4c 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65  ALYZE  <database
a4b0: 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
a4c0: 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
a4d0: 41 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62  ANALYZE  ?<datab
a4e0: 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
a4f0: 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 3.**.** Fo
a500: 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
a510: 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
a520: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
a530: 73 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  s to be analyzed
a540: 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c  ..** Form 2 anal
a550: 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  yzes all indices
a560: 20 74 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61   the single data
a570: 62 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46  base named..** F
a580: 6f 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61  orm 3 analyzes a
a590: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
a5a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
a5b0: 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  amed table..*/.v
a5c0: 6f 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  oid sqlite3Analy
a5d0: 7a 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ze(Parse *pParse
a5e0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
a5f0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
a600: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a610: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a620: 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b  nt iDb;.  int i;
a630: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62  .  char *z, *zDb
a640: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
a650: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
a660: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
a670: 61 6d 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ame;..  /* Read 
a680: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
a690: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
a6a0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
a6b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
a6c0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
a6d0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
a6e0: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73  rn NULL. */.  as
a6f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
a700: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
a710: 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b  s(pParse->db) );
a720: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
a730: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
a740: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
a750: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
a760: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32    assert( pName2
a770: 21 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30  !=0 || pName1==0
a780: 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   );.  if( pName1
a790: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f  ==0 ){.    /* Fo
a7a0: 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65  rm 1:  Analyze e
a7b0: 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20  verything */.   
a7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a7d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
a7e0: 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74   if( i==1 ) cont
a7f0: 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74  inue;  /* Do not
a800: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d   analyze the TEM
a810: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
a820: 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62      analyzeDatab
a830: 61 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ase(pParse, i);.
a840: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
a850: 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29  ( pName2->n==0 )
a860: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a  {.    /* Form 2:
a870: 20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61    Analyze the da
a880: 74 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20  tabase or table 
a890: 6e 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62  named */.    iDb
a8a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
a8b0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
a8c0: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
a8d0: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74        analyzeDat
a8e0: 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44  abase(pParse, iD
a8f0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
a900: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
a910: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
a920: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
a930: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
a940: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
a950: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
a960: 62 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a  b, z, 0))!=0 ){.
a970: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
a980: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
a990: 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64  Idx->pTable, pId
a9a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
a9b0: 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71  e if( (pTab = sq
a9c0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a9d0: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 30  (pParse, 0, z, 0
a9e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
a9f0: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
aa00: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
aa10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aa20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
aa30: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
aa40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
aa50: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20  .    /* Form 3: 
aa60: 41 6e 61 6c 79 7a 65 20 74 68 65 20 66 75 6c 6c  Analyze the full
aa70: 79 20 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  y qualified tabl
aa80: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 44  e name */.    iD
aa90: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
aaa0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
aab0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
aac0: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  pTableName);.   
aad0: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
aae0: 20 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61       zDb = db->a
aaf0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
ab00: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
ab10: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
ab20: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
ab30: 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20       if( z ){.  
ab40: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20        if( (pIdx 
ab50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
ab60: 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21  ex(db, z, zDb))!
ab70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ab80: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
ab90: 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  rse, pIdx->pTabl
aba0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
abb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61    }else if( (pTa
abc0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
abd0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
abe0: 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b  , z, zDb))!=0 ){
abf0: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
ac00: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
ac10: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
ac20: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
ac30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
ac40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
ac50: 20 20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20    .  }.}../*.** 
ac60: 55 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  Used to pass inf
ac70: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
ac80: 65 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65  e analyzer reade
ac90: 72 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  r through to the
aca0: 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  .** callback rou
acb0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
acc0: 20 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73   struct analysis
acd0: 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66  Info analysisInf
ace0: 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73  o;.struct analys
acf0: 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74  isInfo {.  sqlit
ad00: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
ad10: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b  char *zDatabase;
ad20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
ad30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 6f  irst argument po
ad40: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
ad50: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
ad60: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
ad70: 6c 69 73 74 20 6f 66 20 73 70 61 63 65 20 73 65  list of space se
ad80: 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72 73  parated integers
ad90: 2e 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  . Read the first
ada0: 20 6e 4f 75 74 20 6f 66 20 74 68 65 73 65 20 69   nOut of these i
adb0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79  nto.** the array
adc0: 20 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74   aOut[]..*/.stat
add0: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 49 6e  ic void decodeIn
ade0: 74 41 72 72 61 79 28 0a 20 20 63 68 61 72 20 2a  tArray(.  char *
adf0: 7a 49 6e 74 41 72 72 61 79 2c 20 20 20 20 20 20  zIntArray,      
ae00: 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61   /* String conta
ae10: 69 6e 69 6e 67 20 69 6e 74 20 61 72 72 61 79 20  ining int array 
ae20: 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69  to decode */.  i
ae30: 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
ae40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ae50: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 4f 75 74  of slots in aOut
ae60: 5b 5d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  [] */.  tRowcnt 
ae70: 2a 61 4f 75 74 2c 20 20 20 20 20 20 20 20 20 2f  *aOut,         /
ae80: 2a 20 53 74 6f 72 65 20 69 6e 74 65 67 65 72 73  * Store integers
ae90: 20 68 65 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78   here */.  Index
aea0: 20 2a 70 49 6e 64 65 78 20 20 20 20 20 20 20 20   *pIndex        
aeb0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 65 78 74 72    /* Handle extr
aec0: 61 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73  a flags for this
aed0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
aee0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ULL */.){.  char
aef0: 20 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61 79 3b   *z = zIntArray;
af00: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
af10: 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76 3b 0a  i;.  tRowcnt v;.
af20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
af30: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
af40: 54 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d 30 20  TAT4.  if( z==0 
af50: 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  ) z = "";.#else.
af60: 20 20 69 66 28 20 4e 45 56 45 52 28 7a 3d 3d 30    if( NEVER(z==0
af70: 29 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6e 64  ) ) z = "";.#end
af80: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a  if.  for(i=0; *z
af90: 20 26 26 20 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29   && i<nOut; i++)
afa0: 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20  {.    v = 0;.   
afb0: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29   while( (c=z[0])
afc0: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20  >='0' && c<='9' 
afd0: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31  ){.      v = v*1
afe0: 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20  0 + c - '0';.   
aff0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
b000: 20 20 61 4f 75 74 5b 69 5d 20 3d 20 76 3b 0a 20    aOut[i] = v;. 
b010: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29     if( *z==' ' )
b020: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
b030: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
b040: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 6e 6f  ( strcmp(z, "uno
b050: 72 64 65 72 65 64 22 29 3d 3d 30 20 29 7b 0a 20  rdered")==0 ){. 
b060: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e       pIndex->bUn
b070: 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  ordered = 1;.   
b080: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
b090: 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b  e3_strglob("sz=[
b0a0: 30 2d 39 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  0-9]*", z)==0 ){
b0b0: 0a 20 20 20 20 20 20 69 6e 74 20 76 33 32 20 3d  .      int v32 =
b0c0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
b0d0: 33 47 65 74 49 6e 74 33 32 28 7a 2b 33 2c 20 26  3GetInt32(z+3, &
b0e0: 76 33 32 29 3b 0a 20 20 20 20 20 20 70 49 6e 64  v32);.      pInd
b0f0: 65 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  ex->szIdxRow = s
b100: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 33 32  qlite3LogEst(v32
b110: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b120: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  /*.** This callb
b130: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ack is invoked o
b140: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64  nce for each ind
b150: 65 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ex when reading 
b160: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74  the.** sqlite_st
b170: 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a  at1 table.  .**.
b180: 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d  **     argv[0] =
b190: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
b1a0: 6c 65 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31  le.**     argv[1
b1b0: 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ] = name of the 
b1c0: 69 6e 64 65 78 20 28 6d 69 67 68 74 20 62 65 20  index (might be 
b1d0: 4e 55 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67  NULL).**     arg
b1e0: 76 5b 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f  v[2] = results o
b1f0: 66 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20  f analysis - on 
b200: 69 6e 74 65 67 65 72 20 66 6f 72 20 65 61 63 68  integer for each
b210: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e   column.**.** En
b220: 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20  tries for which 
b230: 61 72 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69  argv[1]==NULL si
b240: 6d 70 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20  mply record the 
b250: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
b260: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a  n.** the table..
b270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
b280: 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69  alysisLoader(voi
b290: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
b2a0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
b2b0: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
b2c0: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
b2d0: 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79   *pInfo = (analy
b2e0: 73 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a  sisInfo*)pData;.
b2f0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
b300: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
b310: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b320: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  z;..  assert( ar
b330: 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45  gc==3 );.  UNUSE
b340: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
b350: 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20  Used, argc);..  
b360: 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61  if( argv==0 || a
b370: 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67  rgv[0]==0 || arg
b380: 76 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  v[2]==0 ){.    r
b390: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
b3a0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
b3b0: 69 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e  indTable(pInfo->
b3c0: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e  db, argv[0], pIn
b3d0: 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  fo->zDatabase);.
b3e0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
b3f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b400: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b  .  }.  if( argv[
b410: 31 5d 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  1] ){.    pIndex
b420: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
b430: 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61  dex(pInfo->db, a
b440: 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a  rgv[1], pInfo->z
b450: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 65 6c  Database);.  }el
b460: 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  se{.    pIndex =
b470: 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72   0;.  }.  z = ar
b480: 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49  gv[2];..  if( pI
b490: 6e 64 65 78 20 29 7b 0a 20 20 20 20 64 65 63 6f  ndex ){.    deco
b4a0: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
b4b0: 2a 29 7a 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  *)z, pIndex->nCo
b4c0: 6c 75 6d 6e 2b 31 2c 20 70 49 6e 64 65 78 2d 3e  lumn+1, pIndex->
b4d0: 61 69 52 6f 77 45 73 74 2c 20 70 49 6e 64 65 78  aiRowEst, pIndex
b4e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
b4f0: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
b500: 3d 3d 30 20 29 20 70 54 61 62 6c 65 2d 3e 6e 52  ==0 ) pTable->nR
b510: 6f 77 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e  owEst = pIndex->
b520: 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 7d  aiRowEst[0];.  }
b530: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
b540: 66 61 6b 65 49 64 78 3b 0a 20 20 20 20 66 61 6b  fakeIdx;.    fak
b550: 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d 20  eIdx.szIdxRow = 
b560: 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77  pTable->szTabRow
b570: 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  ;.    decodeIntA
b580: 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20 31  rray((char*)z, 1
b590: 2c 20 26 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  , &pTable->nRowE
b5a0: 73 74 2c 20 26 66 61 6b 65 49 64 78 29 3b 0a 20  st, &fakeIdx);. 
b5b0: 20 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62     pTable->szTab
b5c0: 52 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e 73 7a  Row = fakeIdx.sz
b5d0: 49 64 78 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 72  IdxRow;.  }..  r
b5e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b5f0: 2a 20 49 66 20 74 68 65 20 49 6e 64 65 78 2e 61  * If the Index.a
b600: 53 61 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  Sample variable 
b610: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c  is not NULL, del
b620: 65 74 65 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ete the aSample[
b630: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20 69  ] array.** and i
b640: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a  ts contents..*/.
b650: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
b660: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 73  teIndexSamples(s
b670: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
b680: 78 20 2a 70 49 64 78 29 7b 0a 23 69 66 64 65 66  x *pIdx){.#ifdef
b690: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b6a0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
b6b0: 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  if( pIdx->aSampl
b6c0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  e ){.    int j;.
b6d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b6e0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b  Idx->nSample; j+
b6f0: 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 53  +){.      IndexS
b700: 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49 64 78  ample *p = &pIdx
b710: 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20  ->aSample[j];.  
b720: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b730: 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a 20 20 20  e(db, p->p);.   
b740: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
b750: 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 61  Free(db, pIdx->a
b760: 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  Sample);.  }.  i
b770: 66 28 20 64 62 20 26 26 20 64 62 2d 3e 70 6e 42  f( db && db->pnB
b780: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
b790: 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c      pIdx->nSampl
b7a0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 2d  e = 0;.    pIdx-
b7b0: 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  >aSample = 0;.  
b7c0: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
b7d0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
b7e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b7f0: 45 52 28 70 49 64 78 29 3b 0a 23 65 6e 64 69 66  ER(pIdx);.#endif
b800: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
b810: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b820: 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   */.}..#ifdef SQ
b830: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b840: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
b850: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49   Populate the pI
b860: 64 78 2d 3e 61 41 76 67 45 71 5b 5d 20 61 72 72  dx->aAvgEq[] arr
b870: 61 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ay based on the 
b880: 73 61 6d 70 6c 65 73 20 63 75 72 72 65 6e 74 6c  samples currentl
b890: 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 70  y.** stored in p
b8a0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e 20  Idx->aSample[]. 
b8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b8c0: 69 6e 69 74 41 76 67 45 71 28 49 6e 64 65 78 20  initAvgEq(Index 
b8d0: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49  *pIdx){.  if( pI
b8e0: 64 78 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53  dx ){.    IndexS
b8f0: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
b900: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
b910: 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20      IndexSample 
b920: 2a 70 46 69 6e 61 6c 20 3d 20 26 61 53 61 6d 70  *pFinal = &aSamp
b930: 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  le[pIdx->nSample
b940: 2d 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  -1];.    int iCo
b950: 6c 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  l;.    for(iCol=
b960: 30 3b 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  0; iCol<pIdx->nC
b970: 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  olumn; iCol++){.
b980: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
b9b0: 74 65 20 74 68 72 6f 75 67 68 20 73 61 6d 70 6c  te through sampl
b9c0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77  es */.      tRow
b9d0: 63 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b 20 20  cnt sumEq = 0;  
b9e0: 20 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20        /* Sum of 
b9f0: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 2a  the nEq values *
ba00: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
ba10: 6e 53 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  nSum = 0;       
ba20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
ba30: 65 72 6d 73 20 63 6f 6e 74 72 69 62 75 74 69 6e  erms contributin
ba40: 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20  g to sumEq */.  
ba50: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 76 67 45      tRowcnt avgE
ba60: 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 52 6f  q = 0;.      tRo
ba70: 77 63 6e 74 20 6e 44 4c 74 20 3d 20 70 46 69 6e  wcnt nDLt = pFin
ba80: 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 3b  al->anDLt[iCol];
ba90: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e  ..      /* Set n
baa0: 53 75 6d 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  Sum to the numbe
bab0: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 28 69  r of distinct (i
bac0: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
bad0: 66 69 78 65 73 20 74 68 61 74 0a 20 20 20 20 20  fixes that.     
bae0: 20 2a 2a 20 6f 63 63 75 72 20 69 6e 20 74 68 65   ** occur in the
baf0: 20 73 74 61 74 34 20 74 61 62 6c 65 20 66 6f 72   stat4 table for
bb00: 20 74 68 69 73 20 69 6e 64 65 78 20 62 65 66 6f   this index befo
bb10: 72 65 20 70 46 69 6e 61 6c 2e 20 53 65 74 0a 20  re pFinal. Set. 
bb20: 20 20 20 20 20 2a 2a 20 73 75 6d 45 71 20 74 6f       ** sumEq to
bb30: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bb40: 6e 45 71 20 76 61 6c 75 65 73 20 66 6f 72 20 63  nEq values for c
bb50: 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f 72 20 74  olumn iCol for t
bb60: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
bb70: 20 73 65 74 20 28 61 64 64 69 6e 67 20 74 68 65   set (adding the
bb80: 20 76 61 6c 75 65 20 6f 6e 6c 79 20 6f 6e 63 65   value only once
bb90: 20 77 68 65 72 65 20 74 68 65 72 65 20 65 78 69   where there exi
bba0: 73 74 20 64 75 70 69 63 61 74 65 20 0a 20 20 20  st dupicate .   
bbb0: 20 20 20 2a 2a 20 70 72 65 66 69 78 65 73 29 2e     ** prefixes).
bbc0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
bbd0: 3d 30 3b 20 69 3c 28 70 49 64 78 2d 3e 6e 53 61  =0; i<(pIdx->nSa
bbe0: 6d 70 6c 65 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20  mple-1); i++){. 
bbf0: 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
bc00: 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c  le[i].anDLt[iCol
bc10: 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e  ]!=aSample[i+1].
bc20: 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 29 7b 0a 20  anDLt[iCol] ){. 
bc30: 20 20 20 20 20 20 20 20 20 73 75 6d 45 71 20 2b           sumEq +
bc40: 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
bc50: 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  q[iCol];.       
bc60: 20 20 20 6e 53 75 6d 2b 2b 3b 0a 20 20 20 20 20     nSum++;.     
bc70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bc80: 20 20 20 69 66 28 20 6e 44 4c 74 3e 6e 53 75 6d     if( nDLt>nSum
bc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 76 67 45   ){.        avgE
bca0: 71 20 3d 20 28 70 46 69 6e 61 6c 2d 3e 61 6e 4c  q = (pFinal->anL
bcb0: 74 5b 69 43 6f 6c 5d 20 2d 20 73 75 6d 45 71 29  t[iCol] - sumEq)
bcc0: 2f 28 6e 44 4c 74 20 2d 20 6e 53 75 6d 29 3b 0a  /(nDLt - nSum);.
bcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
bce0: 28 20 61 76 67 45 71 3d 3d 30 20 29 20 61 76 67  ( avgEq==0 ) avg
bcf0: 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  Eq = 1;.      pI
bd00: 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d  dx->aAvgEq[iCol]
bd10: 20 3d 20 61 76 67 45 71 3b 0a 20 20 20 20 20 20   = avgEq;.      
bd20: 69 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  if( pIdx->nSampl
bd30: 65 43 6f 6c 3d 3d 31 20 29 20 62 72 65 61 6b 3b  eCol==1 ) break;
bd40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
bd50: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e  .** Load the con
bd60: 74 65 6e 74 20 66 72 6f 6d 20 65 69 74 68 65 72  tent from either
bd70: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
bd80: 34 20 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74  4 or sqlite_stat
bd90: 33 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f  3 table .** into
bda0: 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 49 6e   the relevant In
bdb0: 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72  dex.aSample[] ar
bdc0: 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rays..**.** Argu
bdd0: 6d 65 6e 74 73 20 7a 53 71 6c 31 20 61 6e 64 20  ments zSql1 and 
bde0: 7a 53 71 6c 32 20 6d 75 73 74 20 70 6f 69 6e 74  zSql2 must point
bdf0: 20 74 6f 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   to SQL statemen
be00: 74 73 20 74 68 61 74 20 72 65 74 75 72 6e 0a 2a  ts that return.*
be10: 2a 20 64 61 74 61 20 65 71 75 69 76 61 6c 65 6e  * data equivalen
be20: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
be30: 6e 67 20 28 73 74 61 74 65 6d 65 6e 74 73 20 61  ng (statements a
be40: 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
be50: 20 73 74 61 74 33 2c 0a 2a 2a 20 73 65 65 20 74   stat3,.** see t
be60: 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  he caller of thi
be70: 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  s function for d
be80: 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20  etails):.**.**  
be90: 20 20 7a 53 71 6c 31 3a 20 53 45 4c 45 43 54 20    zSql1: SELECT 
bea0: 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f  idx,count(*) FRO
beb0: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
bec0: 34 20 47 52 4f 55 50 20 42 59 20 69 64 78 0a 2a  4 GROUP BY idx.*
bed0: 2a 20 20 20 20 7a 53 71 6c 32 3a 20 53 45 4c 45  *    zSql2: SELE
bee0: 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e  CT idx,neq,nlt,n
bef0: 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20  dlt,sample FROM 
bf00: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 0a  %Q.sqlite_stat4.
bf10: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 25 51 20 69  **.** where %Q i
bf20: 73 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  s replaced with 
bf30: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
bf40: 65 20 62 65 66 6f 72 65 20 74 68 65 20 53 51 4c  e before the SQL
bf50: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f   is executed..*/
bf60: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64  .static int load
bf70: 53 74 61 74 54 62 6c 28 0a 20 20 73 71 6c 69 74  StatTbl(.  sqlit
bf80: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
bf90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bfa0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
bfb0: 20 69 6e 74 20 62 53 74 61 74 33 2c 20 20 20 20   int bStat3,    
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bfd0: 2a 20 41 73 73 75 6d 65 20 73 69 6e 67 6c 65 20  * Assume single 
bfe0: 63 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 73 20 6f  column records o
bff0: 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nly */.  const c
c000: 68 61 72 20 2a 7a 53 71 6c 31 2c 20 20 20 20 20  har *zSql1,     
c010: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
c020: 61 74 65 6d 65 6e 74 20 31 20 28 73 65 65 20 61  atement 1 (see a
c030: 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  bove) */.  const
c040: 20 63 68 61 72 20 2a 7a 53 71 6c 32 2c 20 20 20   char *zSql2,   
c050: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
c060: 73 74 61 74 65 6d 65 6e 74 20 32 20 28 73 65 65  statement 2 (see
c070: 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e   above) */.  con
c080: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 20 20 20  st char *zDb    
c090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
c0a0: 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 2e 67  tabase name (e.g
c0b0: 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a  . "main") */.){.
c0c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 73 20  /* Result codes 
c0f0: 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
c100: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
c110: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
c120: 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
c130: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 75  atement being ru
c140: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  n */.  char *zSq
c150: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c160: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
c170: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c180: 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
c190: 72 65 76 49 64 78 20 3d 20 30 3b 20 20 20 20 20  revIdx = 0;     
c1a0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
c1b0: 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
c1c0: 6f 70 20 2a 2f 0a 20 20 49 6e 64 65 78 53 61 6d  op */.  IndexSam
c1d0: 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 20 20 20  ple *pSample;   
c1e0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20        /* A slot 
c1f0: 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  in pIdx->aSample
c200: 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
c210: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
c220: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
c230: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
c240: 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31 2c  rintf(db, zSql1,
c250: 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53   zDb);.  if( !zS
c260: 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ql ){.    return
c270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c280: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
c290: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
c2a0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
c2b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
c2c0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
c2d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
c2e0: 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73   rc;..  while( s
c2f0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
c300: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
c310: 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 43 6f  {.    int nIdxCo
c320: 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
c330: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c340: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 74 61 74   columns in stat
c350: 34 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  4 records */.   
c360: 20 69 6e 74 20 6e 41 76 67 43 6f 6c 20 3d 20 31   int nAvgCol = 1
c370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
c390: 69 65 73 20 69 6e 20 49 6e 64 65 78 2e 61 41 76  ies in Index.aAv
c3a0: 67 45 71 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72  gEq */..    char
c3b0: 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49   *zIndex;   /* I
c3c0: 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ndex name */.   
c3d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
c3e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
c3f0: 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  he index object 
c400: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d 70  */.    int nSamp
c410: 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  le;    /* Number
c420: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20   of samples */. 
c430: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
c440: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
c450: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f  pace required */
c460: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
c470: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
c480: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
c490: 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a  */.    tRowcnt *
c4a0: 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49 6e  pSpace;..    zIn
c4b0: 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71  dex = (char *)sq
c4c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
c4d0: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
c4e0: 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29   if( zIndex==0 )
c4f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
c500: 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
c510: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
c520: 74 2c 20 31 29 3b 0a 20 20 20 20 70 49 64 78 20  t, 1);.    pIdx 
c530: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
c540: 65 78 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a  ex(db, zIndex, z
c550: 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Db);.    assert(
c560: 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74 61   pIdx==0 || bSta
c570: 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d  t3 || pIdx->nSam
c580: 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  ple==0 );.    /*
c590: 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20 69   Index.nSample i
c5a0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74 68  s non-zero at th
c5b0: 69 73 20 70 6f 69 6e 74 20 69 66 20 64 61 74 61  is point if data
c5c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c5d0: 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64 20  n.    ** loaded 
c5e0: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 34 20 74  from the stat4 t
c5f0: 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
c600: 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20  se ignore stat3 
c610: 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69 66  data.  */.    if
c620: 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64  ( pIdx==0 || pId
c630: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f 6e  x->nSample ) con
c640: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62  tinue;.    if( b
c650: 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20 20  Stat3==0 ){.    
c660: 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78    nIdxCol = pIdx
c670: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 0a 20 20 20  ->nColumn+1;.   
c680: 20 20 20 6e 41 76 67 43 6f 6c 20 3d 20 70 49 64     nAvgCol = pId
c690: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
c6a0: 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d  }.    pIdx->nSam
c6b0: 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78 43 6f 6c  pleCol = nIdxCol
c6c0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
c6d0: 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d 70 6c 65  zeof(IndexSample
c6e0: 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  ) * nSample;.   
c6f0: 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66   nByte += sizeof
c700: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 49 64 78  (tRowcnt) * nIdx
c710: 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61 6d 70 6c  Col * 3 * nSampl
c720: 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  e;.    nByte += 
c730: 6e 41 76 67 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  nAvgCol * sizeof
c740: 28 74 52 6f 77 63 6e 74 29 3b 20 20 20 20 20 2f  (tRowcnt);     /
c750: 2a 20 53 70 61 63 65 20 66 6f 72 20 49 6e 64 65  * Space for Inde
c760: 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f 0a 0a 20  x.aAvgEq[] */.. 
c770: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
c780: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c790: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
c7a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
c7b0: 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20  >aSample==0 ){. 
c7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
c7d0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
c7e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c7f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
c800: 20 20 20 70 53 70 61 63 65 20 3d 20 28 74 52 6f     pSpace = (tRo
c810: 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61 53 61  wcnt*)&pIdx->aSa
c820: 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20  mple[nSample];. 
c830: 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71 20     pIdx->aAvgEq 
c840: 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  = pSpace; pSpace
c850: 20 2b 3d 20 6e 41 76 67 43 6f 6c 3b 0a 20 20 20   += nAvgCol;.   
c860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61 6d   for(i=0; i<nSam
c870: 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
c880: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69   pIdx->aSample[i
c890: 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61 63 65 3b  ].anEq = pSpace;
c8a0: 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43   pSpace += nIdxC
c8b0: 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  ol;.      pIdx->
c8c0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 20  aSample[i].anLt 
c8d0: 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  = pSpace; pSpace
c8e0: 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20   += nIdxCol;.   
c8f0: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
c900: 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53 70 61  [i].anDLt = pSpa
c910: 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49  ce; pSpace += nI
c920: 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  dxCol;.    }.   
c930: 20 61 73 73 65 72 74 28 20 28 28 75 38 2a 29 70   assert( ((u8*)p
c940: 53 70 61 63 65 29 2d 6e 42 79 74 65 3d 3d 28 75  Space)-nByte==(u
c950: 38 2a 29 28 70 49 64 78 2d 3e 61 53 61 6d 70 6c  8*)(pIdx->aSampl
c960: 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  e) );.  }.  rc =
c970: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
c980: 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
c990: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c9a0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
c9b0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53 71  3MPrintf(db, zSq
c9c0: 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  l2, zDb);.  if( 
c9d0: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zSql ){.    ret
c9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c9f0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
ca00: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
ca10: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
ca20: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
ca30: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
ca40: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ca50: 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
ca60: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
ca70: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
ca80: 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  W ){.    char *z
ca90: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
caa0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
cab0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65  name */.    Inde
cac0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
cad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
cae0: 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65  nter to the inde
caf0: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  x object */.    
cb00: 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20 20 20  int nCol = 1;   
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
cb30: 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  ns in index */..
cb40: 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68      zIndex = (ch
cb50: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
cb60: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
cb70: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64  0);.    if( zInd
cb80: 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ex==0 ) continue
cb90: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c  ;.    pIdx = sql
cba0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
cbb0: 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a  , zIndex, zDb);.
cbc0: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
cbd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cbe0: 2f 2a 20 54 68 69 73 20 6e 65 78 74 20 63 6f 6e  /* This next con
cbf0: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
cc00: 66 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61  f data has alrea
cc10: 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66  dy been loaded f
cc20: 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  rom .    ** the 
cc30: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62  sqlite_stat4 tab
cc40: 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
cc50: 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20 64 61   ignore stat3 da
cc60: 74 61 2e 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c  ta.  */.    nCol
cc70: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
cc80: 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 62 53 74  Col;.    if( bSt
cc90: 61 74 33 20 26 26 20 6e 43 6f 6c 3e 31 20 29 20  at3 && nCol>1 ) 
cca0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
ccb0: 28 20 70 49 64 78 21 3d 70 50 72 65 76 49 64 78  ( pIdx!=pPrevIdx
ccc0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 69 74 41 76   ){.      initAv
ccd0: 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20  gEq(pPrevIdx);. 
cce0: 20 20 20 20 20 70 50 72 65 76 49 64 78 20 3d 20       pPrevIdx = 
ccf0: 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pIdx;.    }.    
cd00: 70 53 61 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d  pSample = &pIdx-
cd10: 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e  >aSample[pIdx->n
cd20: 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64 65 63  Sample];.    dec
cd30: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
cd40: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
cd50: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29 2c  n_text(pStmt,1),
cd60: 20 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e   nCol, pSample->
cd70: 61 6e 45 71 2c 20 30 29 3b 0a 20 20 20 20 64 65  anEq, 0);.    de
cd80: 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68  codeIntArray((ch
cd90: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
cda0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
cdb0: 2c 20 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d  , nCol, pSample-
cdc0: 3e 61 6e 4c 74 2c 20 30 29 3b 0a 20 20 20 20 64  >anLt, 0);.    d
cdd0: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
cde0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
cdf0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33  umn_text(pStmt,3
ce00: 29 2c 20 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c 65  ), nCol, pSample
ce10: 2d 3e 61 6e 44 4c 74 2c 30 29 3b 0a 0a 20 20 20  ->anDLt,0);..   
ce20: 20 2f 2a 20 54 61 6b 65 20 61 20 63 6f 70 79 20   /* Take a copy 
ce30: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 41  of the sample. A
ce40: 64 64 20 74 77 6f 20 30 78 30 30 20 62 79 74 65  dd two 0x00 byte
ce50: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  s the end of the
ce60: 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20   buffer..    ** 
ce70: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
ce80: 74 68 65 20 73 61 6d 70 6c 65 20 72 65 63 6f 72  the sample recor
ce90: 64 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  d is corrupted. 
cea0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
ceb0: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
cec0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
ced0: 65 28 29 20 6d 61 79 20 72 65 61 64 20 75 70 20  e() may read up 
cee0: 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
cef0: 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  ast the.    ** e
cf00: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
cf10: 74 65 64 20 62 75 66 66 65 72 20 62 65 66 6f 72  ted buffer befor
cf20: 65 20 69 74 20 72 65 61 6c 69 7a 65 73 20 69 74  e it realizes it
cf30: 20 69 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68   is dealing with
cf40: 0a 20 20 20 20 2a 2a 20 61 20 63 6f 72 72 75 70  .    ** a corrup
cf50: 74 20 72 65 63 6f 72 64 2e 20 41 64 64 69 6e 67  t record. Adding
cf60: 20 74 68 65 20 74 77 6f 20 30 78 30 30 20 62 79   the two 0x00 by
cf70: 74 65 73 20 70 72 65 76 65 6e 74 73 20 74 68 69  tes prevents thi
cf80: 73 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20  s from causing. 
cf90: 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
cfa0: 76 65 72 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20  verread.  */.   
cfb0: 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71   pSample->n = sq
cfc0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
cfd0: 65 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20  es(pStmt, 4);.  
cfe0: 20 20 70 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73    pSample->p = s
cff0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
d000: 72 6f 28 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e  ro(db, pSample->
d010: 6e 20 2b 20 32 29 3b 0a 20 20 20 20 69 66 28 20  n + 2);.    if( 
d020: 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b  pSample->p==0 ){
d030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d040: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
d050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d060: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
d070: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53 61 6d  .    memcpy(pSam
d080: 70 6c 65 2d 3e 70 2c 20 73 71 6c 69 74 65 33 5f  ple->p, sqlite3_
d090: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
d0a0: 74 2c 20 34 29 2c 20 70 53 61 6d 70 6c 65 2d 3e  t, 4), pSample->
d0b0: 6e 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53  n);.    pIdx->nS
d0c0: 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72  ample++;.  }.  r
d0d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
d0e0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
d0f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d100: 20 29 20 69 6e 69 74 41 76 67 45 71 28 70 50 72   ) initAvgEq(pPr
d110: 65 76 49 64 78 29 3b 0a 20 20 72 65 74 75 72 6e  evIdx);.  return
d120: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
d130: 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
d140: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
d150: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
d160: 33 20 74 61 62 6c 65 73 20 69 6e 74 6f 20 0a 2a  3 tables into .*
d170: 2a 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d  * the Index.aSam
d180: 70 6c 65 5b 5d 20 61 72 72 61 79 73 20 6f 66 20  ple[] arrays of 
d190: 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  all indices..*/.
d1a0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53  static int loadS
d1b0: 74 61 74 34 28 73 71 6c 69 74 65 33 20 2a 64 62  tat4(sqlite3 *db
d1c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
d1d0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
d1e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d1f0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
d200: 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f  codes from subro
d210: 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20 61 73 73  utines */..  ass
d220: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
d230: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
d240: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
d250: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
d260: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 7a 44 62  lite_stat4", zDb
d270: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  ) ){.    rc = lo
d280: 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20 30 2c  adStatTbl(db, 0,
d290: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
d2a0: 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  dx,count(*) FROM
d2b0: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
d2c0: 20 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20   GROUP BY idx", 
d2d0: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
d2e0: 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c  dx,neq,nlt,ndlt,
d2f0: 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73  sample FROM %Q.s
d300: 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a 20 20  qlite_stat4",.  
d310: 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20      zDb.    );. 
d320: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
d330: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
d340: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
d350: 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20  "sqlite_stat3", 
d360: 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  zDb) ){.    rc =
d370: 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c   loadStatTbl(db,
d380: 20 31 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43   1,.      "SELEC
d390: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
d3a0: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
d3b0: 61 74 33 20 47 52 4f 55 50 20 42 59 20 69 64 78  at3 GROUP BY idx
d3c0: 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ", .      "SELEC
d3d0: 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64  T idx,neq,nlt,nd
d3e0: 6c 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f 72 64  lt,sqlite_record
d3f0: 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51  (sample) FROM %Q
d400: 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a  .sqlite_stat3",.
d410: 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b        zDb.    );
d420: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
d430: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
d440: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d450: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
d460: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63  /*.** Load the c
d470: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71  ontent of the sq
d480: 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
d490: 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61  qlite_stat3/4 ta
d4a0: 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e  bles. The.** con
d4b0: 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f  tents of sqlite_
d4c0: 73 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74  stat1 are used t
d4d0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49  o populate the I
d4e0: 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a  ndex.aiRowEst[].
d4f0: 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63  ** arrays. The c
d500: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
d510: 65 5f 73 74 61 74 33 2f 34 20 61 72 65 20 75 73  e_stat3/4 are us
d520: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
d530: 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d  he.** Index.aSam
d540: 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a  ple[] arrays..**
d550: 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74  .** If the sqlit
d560: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73  e_stat1 table is
d570: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
d580: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51  the database, SQ
d590: 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73  LITE_ERROR.** is
d5a0: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
d5b0: 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66  is case, even if
d5c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d5d0: 54 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e  TAT3/4 was defin
d5e0: 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f  ed .** during co
d5f0: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
d600: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34  e sqlite_stat3/4
d610: 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e   table is presen
d620: 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a  t, no data is .*
d630: 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a  * read from it..
d640: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
d650: 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77  ENABLE_STAT3/4 w
d660: 61 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e  as defined durin
d670: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
d680: 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  d the .** sqlite
d690: 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20  _stat4 table is 
d6a0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
d6b0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
d6c0: 49 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  ITE_ERROR is.** 
d6d0: 72 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65  returned. Howeve
d6e0: 72 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  r, in this case,
d6f0: 20 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72   data is read fr
d700: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
d710: 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66  at1.** table (if
d720: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20   it is present) 
d730: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
d740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
d750: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
d760: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  this function al
d770: 77 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61  ways sets db->ma
d780: 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54  llocFailed..** T
d790: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
d7a0: 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
d7b0: 20 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65   care about othe
d7c0: 72 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65  r errors, the re
d7d0: 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79  turn.** code may
d7e0: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   be ignored..*/.
d7f0: 69 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  int sqlite3Analy
d800: 73 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20  sisLoad(sqlite3 
d810: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
d820: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49   analysisInfo sI
d830: 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  nfo;.  HashElem 
d840: 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  *i;.  char *zSql
d850: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
d860: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
d870: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
d880: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
d890: 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b  b[iDb].pBt!=0 );
d8a0: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79  ..  /* Clear any
d8b0: 20 70 72 69 6f 72 20 73 74 61 74 69 73 74 69 63   prior statistic
d8c0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  s */.  assert( s
d8d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
d8e0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
d8f0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ) );.  for(i=sql
d900: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
d910: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
d920: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69  ma->idxHash);i;i
d930: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
d940: 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
d950: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
d960: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71  hData(i);.    sq
d970: 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
d980: 73 74 28 70 49 64 78 29 3b 0a 23 69 66 64 65 66  st(pIdx);.#ifdef
d990: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d9a0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
d9b0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
d9c0: 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20  ndexSamples(db, 
d9d0: 70 49 64 78 29 3b 0a 20 20 20 20 70 49 64 78 2d  pIdx);.    pIdx-
d9e0: 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23 65  >aSample = 0;.#e
d9f0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ndif.  }..  /* C
da00: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
da10: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  e the sqlite_sta
da20: 74 31 20 74 61 62 6c 65 20 65 78 69 73 74 73 20  t1 table exists 
da30: 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20  */.  sInfo.db = 
da40: 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74  db;.  sInfo.zDat
da50: 61 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b  abase = db->aDb[
da60: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66  iDb].zName;.  if
da70: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
da80: 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
da90: 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61  tat1", sInfo.zDa
daa0: 74 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20 20  tabase)==0 ){.  
dab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dac0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
dad0: 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69 73   Load new statis
dae0: 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65 20  tics out of the 
daf0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
db00: 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73  le */.  zSql = s
db10: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
db20: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
db30: 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
db40: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
db50: 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61  t1", sInfo.zData
db60: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 7a 53 71  base);.  if( zSq
db70: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
db80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
db90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
dba0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
dbb0: 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73  , zSql, analysis
dbc0: 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20  Loader, &sInfo, 
dbd0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
dbe0: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
dbf0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f 61 64  .  }...  /* Load
dc00: 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20   the statistics 
dc10: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
dc20: 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a  stat4 table. */.
dc30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dc40: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
dc50: 41 54 34 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  AT4.  if( rc==SQ
dc60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
dc70: 6e 74 20 6c 6f 6f 6b 61 73 69 64 65 45 6e 61 62  nt lookasideEnab
dc80: 6c 65 64 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  led = db->lookas
dc90: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20  ide.bEnabled;.  
dca0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
dcb0: 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20  bEnabled = 0;.  
dcc0: 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 34    rc = loadStat4
dcd0: 28 64 62 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61  (db, sInfo.zData
dce0: 62 61 73 65 29 3b 0a 20 20 20 20 64 62 2d 3e 6c  base);.    db->l
dcf0: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
dd00: 64 20 3d 20 6c 6f 6f 6b 61 73 69 64 65 45 6e 61  d = lookasideEna
dd10: 62 6c 65 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  bled;.  }.#endif
dd20: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
dd30: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
dd40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dd50: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
dd60: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69  rn rc;.}...#endi
dd70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
dd80: 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a              _ANALYZE */.