/ Hex Artifact Content
Login

Artifact 3596f863bb80126fe56ba217df5932749271efc8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 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 2e 20 20 54 68 65 20 6e 45  e index.  The nE
1590: 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a 2a  q column is a.**
15a0: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72   list of integer
15b0: 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  s.  The first in
15c0: 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70 70  teger is the app
15d0: 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72 0a  roximate number.
15e0: 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  ** of entries in
15f0: 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   the index whose
1600: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1610: 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  n exactly matche
1620: 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s.** the left-mo
1630: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1640: 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73 65   sample.  The se
1650: 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e 20  cond integer in 
1660: 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61 70  nEq.** is the ap
1670: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
1680: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
1690: 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20 74  he index where t
16a0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f 20  he.** first two 
16b0: 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74 68  columns match th
16c0: 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c 75  e first two colu
16d0: 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  mns of the sampl
16e0: 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  e..** And so for
16f0: 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f 74  th.  nLt is anot
1700: 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74 65  her list of inte
1710: 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20 74  gers that show t
1720: 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a 2a  he approximate.*
1730: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * number of entr
1740: 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74 72  ies that are str
1750: 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ictly less than 
1760: 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65  the sample.  The
1770: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65   first.** intege
1780: 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69 6e  r in nLt contain
1790: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17a0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
17b0: 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a 2a  ndex where the.*
17c0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
17d0: 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  mn is less than 
17e0: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  the left-most co
17f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d 70  lumn of the samp
1800: 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68 20  le..** The K-th 
1810: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e  integer in the n
1820: 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  Lt entry is the 
1830: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
1840: 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65 72  entries .** wher
1850: 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63 6f  e the first K co
1860: 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20 74  lumns are less t
1870: 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b 20  han the first K 
1880: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a  columns of the.*
1890: 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 6e  * sample.  The n
18a0: 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c 69  DLt column is li
18b0: 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74 68  ke nLt except th
18c0: 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  at it contains t
18d0: 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
18e0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69 65   distinct entrie
18f0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74  s in the index t
1900: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
1910: 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65 2e  n the.** sample.
1920: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e  .**.** There can
1930: 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72 79   be an arbitrary
1940: 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74   number of sqlit
1950: 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73 20  e_stat4 entries 
1960: 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68  per index..** Th
1970: 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1980: 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79  d will typically
1990: 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74 65   generate sqlite
19a0: 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a 2a  _stat4 tables.**
19b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62 65   that contain be
19c0: 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30 20  tween 10 and 40 
19d0: 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61 72  samples which ar
19e0: 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61 63  e distributed ac
19f0: 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79 20  ross.** the key 
1a00: 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e 6f  space, though no
1a10: 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e 64  t uniformly, and
1a20: 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20 73   which include s
1a30: 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20 6c  amples with.** l
1a40: 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73 2e  arge nEq values.
1a50: 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66 6f  .**.** Format fo
1a60: 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 72  r sqlite_stat3 r
1a70: 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  edux:.**.** The 
1a80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
1a90: 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69 74  le is like sqlit
1aa0: 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20 74  e_stat4 except t
1ab0: 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20 6c  hat it only.** l
1ac0: 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66 74  ooks at the left
1ad0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
1ae0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
1af0: 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61 6d  sqlite_stat3.sam
1b00: 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 6f  ple.** column co
1b10: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1b20: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  l value of the l
1b30: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
1b40: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61 20  instead.** of a 
1b50: 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f 66  blob encoding of
1b60: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69 6e   the complete in
1b70: 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66 6f  dex key as is fo
1b80: 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  und in.** sqlite
1b90: 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20 20  _stat4.sample.  
1ba0: 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61 6e  The nEq, nLt, an
1bb0: 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20 6f  d nDLt entries o
1bc0: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a  f sqlite_stat3.*
1bd0: 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a 75  * all contain ju
1be0: 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  st a single inte
1bf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1c00: 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69 72   same as the fir
1c10: 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e  st.** integer in
1c20: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
1c30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69 74  columns in sqlit
1c40: 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66 6e  e_stat4..*/.#ifn
1c50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c60: 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64 65  ANALYZE.#include
1c70: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
1c80: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
1ca0: 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61 74  .# define IsStat
1cb0: 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e 65  4     1.# define
1cc0: 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a 23   IsStat3     0.#
1cd0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1cf0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1d00: 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  t4     0.# defin
1d10: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31 0a  e IsStat3     1.
1d20: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 49  #else.# define I
1d30: 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20 64  sStat4     0.# d
1d40: 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20 20  efine IsStat3   
1d50: 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c 49    0.# undef SQLI
1d60: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
1d70: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1d80: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 31  _STAT4_SAMPLES 1
1d90: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
1da0: 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73 53  IsStat34    (IsS
1db0: 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20 2f  tat3+IsStat4)  /
1dc0: 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f 72  * 1 for STAT3 or
1dd0: 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72 77   STAT4. 0 otherw
1de0: 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ise */../*.** Th
1df0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
1e00: 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6f  ates code that o
1e10: 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65 5f  pens the sqlite_
1e20: 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a 2a  statN tables..**
1e30: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
1e40: 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  1 table is alway
1e50: 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71 6c  s relevant.  sql
1e60: 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f 77  ite_stat2 is now
1e70: 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20 73  .** obsolete.  s
1e80: 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64 20  qlite_stat3 and 
1e90: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72 65  sqlite_stat4 are
1ea0: 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68 65   only opened whe
1eb0: 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  n.** appropriate
1ec0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1ed0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69 64  tions are provid
1ee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ef0: 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
1f00: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65 76  bles do not prev
1f10: 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69 74  iously exist, it
1f20: 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1f30: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68 65  ** Argument zWhe
1f40: 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e  re may be a poin
1f50: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1f60: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61 62  containing a tab
1f70: 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20 69  le name,.** or i
1f80: 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c 20  t may be a NULL 
1f90: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
1fa0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
1fb0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1fc0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  ** the sqlite_st
1fd0: 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f 63  atN tables assoc
1fe0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
1ff0: 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20 64  amed table are d
2000: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a 57  eleted..** If zW
2010: 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63 6f  here==0, then co
2020: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
2030: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 74  to delete all st
2040: 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  at table entries
2050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2060: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 0a   openStatTable(.
2070: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2090: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20a0: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20c0: 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72 65   database we are
20d0: 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a 20   looking in */. 
20e0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
20f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2100: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
2110: 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  1 table on this 
2120: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
2130: 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 20  t char *zWhere, 
2140: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 6e      /* Delete en
2150: 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20 74  tries for this t
2160: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
2170: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2180: 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45 69  WhereType  /* Ei
2190: 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22 69  ther "tbl" or "i
21a0: 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  dx" */.){.  stat
21b0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
21c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
21d0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e   *zName;.    con
21e0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 0a  st char *zCols;.
21f0: 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20 7b    } aTable[] = {
2200: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
2210: 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat1", "tbl,idx,
2220: 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65 66  stat" },.#if def
2230: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2240: 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b 20  LE_STAT4).    { 
2250: 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20  "sqlite_stat4", 
2260: 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c 74  "tbl,idx,neq,nlt
2270: 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d 2c  ,ndlt,sample" },
2280: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
2290: 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c 69  tat3", 0 },.#eli
22a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20  _ENABLE_STAT3). 
22c0: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74 61     { "sqlite_sta
22d0: 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e 65  t3", "tbl,idx,ne
22e0: 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c  q,nlt,ndlt,sampl
22f0: 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c  e" },.    { "sql
2300: 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c  ite_stat4", 0 },
2310: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 71  .#else.    { "sq
2320: 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20 7d  lite_stat3", 0 }
2330: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2340: 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65 6e  stat4", 0 },.#en
2350: 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  dif.  };.  int i
2360: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2370: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2380: 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65 20  Db *pDb;.  Vdbe 
2390: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
23a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
23b0: 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53 69  nt aRoot[ArraySi
23c0: 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20 75  ze(aTable)];.  u
23d0: 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72 72  8 aCreateTbl[Arr
23e0: 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b  aySize(aTable)];
23f0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2400: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2410: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2420: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2430: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2440: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d 3d  lite3VdbeDb(v)==
2450: 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  db );.  pDb = &d
2460: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2470: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73 74  /* Create new st
2480: 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20 69  atistic tables i
2490: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65 78  f they do not ex
24a0: 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74 68  ist, or clear th
24b0: 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20  em.  ** if they 
24c0: 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  do already exist
24d0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
24e0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
24f0: 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  able); i++){.   
2500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2510: 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e  b = aTable[i].zN
2520: 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ame;.    Table *
2530: 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20 28  pStat;.    if( (
2540: 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33 46  pStat = sqlite3F
2550: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
2560: 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 3d  b, pDb->zName))=
2570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2580: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 20  aTable[i].zCols 
2590: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25a0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
25b0: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
25c0: 69 73 74 2e 20 43 72 65 61 74 65 20 69 74 2e 20  ist. Create it. 
25d0: 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20 20 20  Note that a .   
25e0: 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65 66 66       ** side-eff
25f0: 65 63 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ect of the CREAT
2600: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2610: 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20 74 68  t is to leave th
2620: 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20 20 20  e rootpage .    
2630: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 65      ** of the ne
2640: 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73  w table in regis
2650: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
2660: 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69 6d 70  oot. This is imp
2670: 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20 20 20  ortant .        
2680: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 4f  ** because the O
2690: 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64 65 20  penWrite opcode 
26a0: 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20 6e 65  below will be ne
26b0: 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20  eding it. */.   
26c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
26d0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
26f0: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25 73 28  ATE TABLE %Q.%s(
2700: 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  %s)", pDb->zName
2710: 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65 5b 69  , zTab, aTable[i
2720: 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20 20 20  ].zCols.        
2730: 29 3b 0a 20 20 20 20 20 20 20 20 61 52 6f 6f 74  );.        aRoot
2740: 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  [i] = pParse->re
2750: 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 61  gRoot;.        a
2760: 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 4f  CreateTbl[i] = O
2770: 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3b 0a 20  PFLAG_P2ISREG;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2790: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
27a0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
27b0: 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65 20 69  sts. If zWhere i
27c0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65  s not NULL, dele
27d0: 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a  te all entries .
27e0: 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61        ** associa
27f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
2800: 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20 7a 57  le zWhere. If zW
2810: 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65  here is NULL, de
2820: 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2830: 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
2840: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
2850: 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 69  */.      aRoot[i
2860: 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b  ] = pStat->tnum;
2870: 0a 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62  .      aCreateTb
2880: 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  l[i] = 0;.      
2890: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
28a0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 61 52  (pParse, iDb, aR
28b0: 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54 61 62 29  oot[i], 1, zTab)
28c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 57 68 65  ;.      if( zWhe
28d0: 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
28e0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
28f0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
2900: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
2910: 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d   %Q.%s WHERE %s=
2920: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %Q",.           
2930: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62  pDb->zName, zTab
2940: 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20 7a 57  , zWhereType, zW
2950: 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  here.        );.
2960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2970: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69       /* The sqli
2980: 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61 62  te_stat[134] tab
2990: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
29a0: 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 72  s.  Delete all r
29b0: 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
29c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29d0: 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61  2(v, OP_Clear, a
29e0: 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20  Root[i], iDb);. 
29f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a00: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2a10: 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
2a20: 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69 74   tables for writ
2a30: 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ing. */.  for(i=
2a40: 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f  0; aTable[i].zCo
2a50: 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ls; i++){.    as
2a60: 73 65 72 74 28 20 69 3c 41 72 72 61 79 53 69 7a  sert( i<ArraySiz
2a70: 65 28 61 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  e(aTable) );.   
2a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2aa0: 57 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2b  Write, iStatCur+
2ab0: 69 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62  i, aRoot[i], iDb
2ac0: 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 3);.    sqlite
2ad0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2ae0: 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b   aCreateTbl[i]);
2af0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2b00: 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65 72  commended number
2b10: 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72 20   of samples for 
2b20: 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f 0a  sqlite_stat4.*/.
2b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
2b40: 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20 64  TAT4_SAMPLES.# d
2b50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41  efine SQLITE_STA
2b60: 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23 65  T4_SAMPLES 24.#e
2b70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65  ndif../*.** Thre
2b80: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  e SQL functions 
2b90: 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20 73  - stat_init(), s
2ba0: 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64 20  tat_push(), and 
2bb0: 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a 20  stat_get() -.** 
2bc0: 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e 63  share an instanc
2bd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2be0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ng structure to 
2bf0: 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74 65  hold their state
2c00: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  .** information.
2c10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2c20: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53 74  ct Stat4Accum St
2c30: 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64 65  at4Accum;.typede
2c40: 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53 61  f struct Stat4Sa
2c50: 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c 65  mple Stat4Sample
2c60: 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53 61  ;.struct Stat4Sa
2c70: 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e 74  mple {.  tRowcnt
2c80: 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20 20   *anEq;         
2c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2ca0: 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f 0a  te_stat4.nEq */.
2cb0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74    tRowcnt *anDLt
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cd0: 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74    /* sqlite_stat
2ce0: 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65 66  4.nDLt */.#ifdef
2cf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2d00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2d10: 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20 20  tRowcnt *anLt;  
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34 2e  /* sqlite_stat4.
2d40: 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  nLt */.  union {
2d50: 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 6e       /* Rowid in
2d80: 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20 74   main table of t
2d90: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75 38  he key */.    u8
2da0: 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20 20   *aRowid;       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc0: 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55 54   Key for WITHOUT
2dd0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
2de0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e 52  .  } u;.  u32 nR
2df0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2e10: 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f 0a  eof aRowid[] */.
2e20: 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b 20    u8 isPSample; 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
2e50: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a  eriodic sample *
2e60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53 61      /* If !isPSa
2e90: 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f 6e  mple, the reason
2ea0: 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a   for inclusion *
2eb0: 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20 20  /.  u32 iHash;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b 65      /* Tiebreake
2ee0: 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69 66  r hash */.#endif
2ef0: 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20 53         .struct S
2f30: 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74 52  tat4Accum {.  tR
2f40: 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20  owcnt nRow;     
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f60: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2f70: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
2f80: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d  .  tRowcnt nPSam
2f90: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ple;         /* 
2fa0: 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20  How often to do 
2fb0: 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  a periodic sampl
2fc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  e */.  int nCol;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2ff0: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2b  lumns in index +
3000: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
3010: 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20  mxSample;       
3020: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3030: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
3040: 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  es to accumulate
3050: 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c   */.  Stat4Sampl
3060: 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20  e current;      
3070: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61  /* Current row a
3080: 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20  s a Stat4Sample 
3090: 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20  */.  u32 iPrn;  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  * Pseudo-random 
30c0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
30d0: 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74  sampling */.  St
30e0: 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74  at4Sample *aBest
30f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ;       /* Array
3100: 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61   of nCol best sa
3110: 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  mples */.  int i
3120: 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Min;            
3130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
3140: 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69   a[] of entry wi
3150: 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65  th minimum score
3160: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c   */.  int nSampl
3170: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3180: 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
3190: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a  r of samples */.
31a0: 20 20 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20    int iGet;     
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31c0: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
31d0: 73 61 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20  sample accessed 
31e0: 62 79 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f  by stat_get() */
31f0: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
3200: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
3210: 41 72 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c  Array of mxSampl
3220: 65 20 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62  e Stat4Sample ob
3230: 6a 65 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  jects */.  sqlit
3240: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3250: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72   connection, for
3270: 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a   malloc() */.};.
3280: 0a 2f 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f  ./* Reclaim memo
3290: 72 79 20 75 73 65 64 20 62 79 20 61 20 53 74 61  ry used by a Sta
32a0: 74 34 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64  t4Sample.*/.#ifd
32b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
32c0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
32d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
32e0: 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  leClear(sqlite3 
32f0: 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65  *db, Stat4Sample
3300: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
3310: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
3320: 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->nRowid ){.    
3330: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3340: 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a  , p->u.aRowid);.
3350: 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20      p->nRowid = 
3360: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
3370: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ./* Initialize t
3380: 68 65 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66  he BLOB value of
3390: 20 61 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64   a ROWID.*/.#ifd
33a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
33b0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
33c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
33d0: 6c 65 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74  leSetRowid(sqlit
33e0: 65 33 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d  e3 *db, Stat4Sam
33f0: 70 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63  ple *p, int n, c
3400: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b  onst u8 *pData){
3410: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
3420: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f   );.  if( p->nRo
3430: 77 69 64 20 29 20 73 71 6c 69 74 65 33 44 62 46  wid ) sqlite3DbF
3440: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f  ree(db, p->u.aRo
3450: 77 69 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f  wid);.  p->u.aRo
3460: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  wid = sqlite3DbM
3470: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b  allocRaw(db, n);
3480: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3490: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
34a0: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
34b0: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
34c0: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
34d0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
34e0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
34f0: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3500: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3510: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3520: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3530: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3540: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
3550: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
3560: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
3570: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3580: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3590: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
35a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
35b0: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
35c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
35d0: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
35e0: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
35f0: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3600: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3610: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3620: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
3630: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
3640: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
3650: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3660: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
3670: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
3680: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3690: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
36a0: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
36b0: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
36c0: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
36d0: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
36e0: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
36f0: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3700: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3710: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3720: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
3730: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
3740: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
3750: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
3760: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
3770: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
3780: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3790: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
37a0: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
37b0: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
37c0: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
37d0: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
37e0: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
37f0: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3800: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3810: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
3830: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
3840: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
3850: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
3860: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
3870: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
3880: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3890: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
38a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
38b0: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
38c0: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
38d0: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
38e0: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
38f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3900: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3910: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3930: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3940: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3950: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3960: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3970: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3980: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3990: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
39a0: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
39b0: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
39c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
39d0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
39e0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
39f0: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3a00: 74 28 4e 2c 43 29 20 53 51 4c 20 66 75 6e 63 74  t(N,C) SQL funct
3a10: 69 6f 6e 2e 20 54 68 65 20 74 77 6f 20 70 61 72  ion. The two par
3a20: 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 20 74  ameters.** are t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
3a40: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  s in the table o
3a50: 72 20 69 6e 64 65 78 20 28 43 29 20 61 6e 64 20  r index (C) and 
3a60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3a70: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
3a80: 69 6e 64 65 78 20 28 4e 29 2e 20 20 54 68 65 20  index (N).  The 
3a90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
3aa0: 28 43 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  (C) is only used
3ab0: 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53   for STAT3 and S
3ac0: 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  TAT4..**.** This
3ad0: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
3ae0: 65 73 20 74 68 65 20 53 74 61 74 34 41 63 63 75  es the Stat4Accu
3af0: 6d 20 6f 62 6a 65 63 74 20 69 6e 20 68 65 61 70  m object in heap
3b00: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72 65 74   memory. The ret
3b10: 75 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20 69 73  urn .** value is
3b20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b30: 65 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d  e the Stat4Accum
3b40: 20 6f 62 6a 65 63 74 20 65 6e 63 6f 64 65 64 20   object encoded 
3b50: 61 73 20 61 20 62 6c 6f 62 20 28 69 2e 65 2e 20  as a blob (i.e. 
3b60: 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20  .** the size of 
3b70: 74 68 65 20 62 6c 6f 62 20 69 73 20 73 69 7a 65  the blob is size
3b80: 6f 66 28 76 6f 69 64 2a 29 20 62 79 74 65 73 29  of(void*) bytes)
3b90: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
3ba0: 64 20 73 74 61 74 49 6e 69 74 28 0a 20 20 73 71  d statInit(.  sq
3bb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3bc0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
3bd0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
3be0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
3bf0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 3b 0a 20  Stat4Accum *p;. 
3c00: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3c30: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 62  lumns in index b
3c40: 65 69 6e 67 20 73 61 6d 70 6c 65 64 20 2a 2f 0a  eing sampled */.
3c50: 20 20 69 6e 74 20 6e 43 6f 6c 55 70 3b 20 20 20    int nColUp;   
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f 75 6e 64 65    /* nCol rounde
3c80: 64 20 75 70 20 66 6f 72 20 61 6c 69 67 6e 6d 65  d up for alignme
3c90: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  nt */.  int n;  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
3cc0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
3cd0: 6f 63 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  ocate */.  sqlit
3ce0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3d00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3d10: 6e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  n */.#ifdef SQLI
3d20: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3d30: 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 6d  OR_STAT4.  int m
3d40: 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49 54 45  xSample = SQLITE
3d50: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 3b 0a  _STAT4_SAMPLES;.
3d60: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 63  #endif..  /* Dec
3d70: 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 66 75  ode the three fu
3d80: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
3d90: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
3da0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
3db0: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  nCol = sqlite3_v
3dc0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
3dd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
3de0: 6c 3e 31 20 29 3b 20 20 20 20 20 20 20 20 20 20  l>1 );          
3df0: 20 20 20 20 20 2f 2a 20 3e 31 20 62 65 63 61 75       /* >1 becau
3e00: 73 65 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  se it includes t
3e10: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
3e20: 2a 2f 0a 20 20 6e 43 6f 6c 55 70 20 3d 20 73 69  */.  nColUp = si
3e30: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 3c 38 20  zeof(tRowcnt)<8 
3e40: 3f 20 28 6e 43 6f 6c 2b 31 29 26 7e 31 20 3a 20  ? (nCol+1)&~1 : 
3e50: 6e 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nCol;..  /* Allo
3e60: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72  cate the space r
3e70: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
3e80: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
3e90: 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f  t */.  n = sizeo
3ea0: 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a  f(*p) .    + siz
3eb0: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
3ec0: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
3ed0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
3ee0: 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b  um.anEq */.    +
3ef0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
3f00: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
3f20: 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a  4Accum.anDLt */.
3f30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3f40: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
3f50: 41 54 34 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66  AT4.    + sizeof
3f60: 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70  (tRowcnt)*nColUp
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e    /* Stat4Accum.
3f90: 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20 73 69  anLt */.    + si
3fa0: 7a 65 6f 66 28 53 74 61 74 34 53 61 6d 70 6c 65  zeof(Stat4Sample
3fb0: 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65  )*(nCol+mxSample
3fc0: 29 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63  )     /* Stat4Ac
3fd0: 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61 5b 5d  cum.aBest[], a[]
3fe0: 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66   */.    + sizeof
3ff0: 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43 6f 6c  (tRowcnt)*3*nCol
4000: 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c  Up*(nCol+mxSampl
4010: 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a 20 20  e).#endif.  ;.  
4020: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
4030: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
4040: 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d 20 73  ontext);.  p = s
4050: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
4060: 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28  ro(db, n);.  if(
4070: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
4080: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4090: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
40a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
40b0: 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  }..  p->db = db;
40c0: 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  .  p->nRow = 0;.
40d0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
40e0: 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ;.  p->current.a
40f0: 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  nDLt = (tRowcnt*
4100: 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 63 75 72  )&p[1];.  p->cur
4110: 72 65 6e 74 2e 61 6e 45 71 20 3d 20 26 70 2d 3e  rent.anEq = &p->
4120: 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 6e 43  current.anDLt[nC
4130: 6f 6c 55 70 5d 3b 0a 0a 23 69 66 64 65 66 20 53  olUp];..#ifdef S
4140: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4150: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 7b 0a  T3_OR_STAT4.  {.
4160: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20      u8 *pSpace; 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
4190: 20 73 70 61 63 65 20 6e 6f 74 20 79 65 74 20 61   space not yet a
41a0: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 69  ssigned */.    i
41b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
41e0: 65 20 74 68 72 6f 75 67 68 20 70 2d 3e 61 53 61  e through p->aSa
41f0: 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70  mple[] */..    p
4200: 2d 3e 69 47 65 74 20 3d 20 2d 31 3b 0a 20 20 20  ->iGet = -1;.   
4210: 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 3d 20 6d   p->mxSample = m
4220: 78 53 61 6d 70 6c 65 3b 0a 20 20 20 20 70 2d 3e  xSample;.    p->
4230: 6e 50 53 61 6d 70 6c 65 20 3d 20 28 74 52 6f 77  nPSample = (tRow
4240: 63 6e 74 29 28 73 71 6c 69 74 65 33 5f 76 61 6c  cnt)(sqlite3_val
4250: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
4260: 29 2f 28 6d 78 53 61 6d 70 6c 65 2f 33 2b 31 29  )/(mxSample/3+1)
4270: 20 2b 20 31 29 3b 0a 20 20 20 20 70 2d 3e 63 75   + 1);.    p->cu
4280: 72 72 65 6e 74 2e 61 6e 4c 74 20 3d 20 26 70 2d  rrent.anLt = &p-
4290: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6e 43  >current.anEq[nC
42a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 69 50  olUp];.    p->iP
42b0: 72 6e 20 3d 20 6e 43 6f 6c 2a 30 78 36 38 39 65  rn = nCol*0x689e
42c0: 39 36 32 64 20 5e 20 73 71 6c 69 74 65 33 5f 76  962d ^ sqlite3_v
42d0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
42e0: 29 2a 30 78 64 30 39 34 34 35 36 35 3b 0a 20 20  )*0xd0944565;.  
42f0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74  .    /* Set up t
4300: 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e 61 5b  he Stat4Accum.a[
4310: 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20 61 72  ] and aBest[] ar
4320: 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d 3e 61  rays */.    p->a
4330: 20 3d 20 28 73 74 72 75 63 74 20 53 74 61 74 34   = (struct Stat4
4340: 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75 72 72  Sample*)&p->curr
4350: 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55 70 5d  ent.anLt[nColUp]
4360: 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74 20 3d  ;.    p->aBest =
4370: 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65 5d   &p->a[mxSample]
4380: 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20 28  ;.    pSpace = (
4390: 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53 61 6d  u8*)(&p->a[mxSam
43a0: 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  ple+nCol]);.    
43b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78 53 61  for(i=0; i<(mxSa
43c0: 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b 2b 29  mple+nCol); i++)
43d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
43e0: 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e 74 20  anEq = (tRowcnt 
43f0: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
4400: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
4410: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
4420: 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e        p->a[i].an
4430: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29  Lt = (tRowcnt *)
4440: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
4450: 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  = (sizeof(tRowcn
4460: 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20  t) * nColUp);.  
4470: 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44 4c      p->a[i].anDL
4480: 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70  t = (tRowcnt *)p
4490: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
44a0: 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74   (sizeof(tRowcnt
44b0: 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20  ) * nColUp);.   
44c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
44d0: 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29 70 29  pSpace - (u8*)p)
44e0: 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20 66 6f  ==n );.  .    fo
44f0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
4500: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 42  ++){.      p->aB
4510: 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20 69 3b  est[i].iCol = i;
4520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
4530: 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  f..  /* Return a
4540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4550: 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
4560: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   to the caller *
4570: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4580: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4590: 20 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 73   p, sizeof(p), s
45a0: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29 3b  tat4Destructor);
45b0: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
45c0: 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74  FuncDef statInit
45d0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
45e0: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
45f0: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
4600: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
4610: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
4620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4630: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
4640: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4650: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
4660: 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20   statInit,      
4670: 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20    /* xFunc */.  
4680: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4690: 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30   /* xStep */.  0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
46b0: 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a  /* xFinalize */.
46c0: 20 20 22 73 74 61 74 5f 69 6e 69 74 22 2c 20 20    "stat_init",  
46d0: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
46e0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
46f0: 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20    /* pHash */.  
4700: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4710: 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20   /* pDestructor 
4720: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
4730: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4740: 34 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64  4./*.** pNew and
4750: 20 70 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63   pOld are both c
4760: 61 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72  andidate non-per
4770: 69 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65  iodic samples se
4780: 6c 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74  lected for .** t
4790: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28  he same column (
47a0: 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64  pNew->iCol==pOld
47b0: 2d 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e  ->iCol). Ignorin
47c0: 67 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e  g this column an
47d0: 64 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  d .** considerin
47e0: 67 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c  g only any trail
47f0: 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ing columns and 
4800: 74 68 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20  the sample hash 
4810: 76 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66  value, this.** f
4820: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
4830: 74 72 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70  true if sample p
4840: 4e 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65  New is to be pre
4850: 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64  ferred over pOld
4860: 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
4870: 72 64 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d  rds, if we assum
4880: 65 20 74 68 61 74 20 74 68 65 20 63 61 72 64 69  e that the cardi
4890: 6e 61 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20  nalities of the 
48a0: 73 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75  selected.** colu
48b0: 6d 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20  mn for pNew and 
48c0: 70 4f 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20  pOld are equal, 
48d0: 69 73 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72  is pNew to be pr
48e0: 65 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c  eferred over pOl
48f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
4900: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
4910: 68 61 74 20 66 6f 72 20 65 61 63 68 20 61 72 67  hat for each arg
4920: 75 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68  ument sample, th
4930: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a  e contents of.**
4940: 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61   the anEq[] arra
4950: 79 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e  y from pSample->
4960: 61 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43  anEq[pSample->iC
4970: 6f 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72  ol+1] onwards ar
4980: 65 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61  e valid. .*/.sta
4990: 74 69 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73  tic int sampleIs
49a0: 42 65 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74  BetterPost(.  St
49b0: 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  at4Accum *pAccum
49c0: 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  , .  Stat4Sample
49d0: 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34   *pNew, .  Stat4
49e0: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a  Sample *pOld.){.
49f0: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63    int nCol = pAc
4a00: 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  cum->nCol;.  int
4a10: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   i;.  assert( pN
4a20: 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e  ew->iCol==pOld->
4a30: 69 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  iCol );.  for(i=
4a40: 70 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c  pNew->iCol+1; i<
4a50: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4a60: 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69  if( pNew->anEq[i
4a70: 5d 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20  ]>pOld->anEq[i] 
4a80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
4a90: 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69  if( pNew->anEq[i
4aa0: 5d 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20  ]<pOld->anEq[i] 
4ab0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
4ac0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73    if( pNew->iHas
4ad0: 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20  h>pOld->iHash ) 
4ae0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
4af0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4b00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4b10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
4b20: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
4b30: 20 74 72 75 65 20 69 66 20 70 4e 65 77 20 69 73   true if pNew is
4b40: 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64   to be preferred
4b50: 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a   over pOld..**.*
4b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4b70: 61 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72  assumes that for
4b80: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73   each argument s
4b90: 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65  ample, the conte
4ba0: 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e  nts of.** the an
4bb0: 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20  Eq[] array from 
4bc0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53  pSample->anEq[pS
4bd0: 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77  ample->iCol] onw
4be0: 61 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20  ards are valid. 
4bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4c00: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20  ampleIsBetter(. 
4c10: 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63   Stat4Accum *pAc
4c20: 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d  cum, .  Stat4Sam
4c30: 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74  ple *pNew, .  St
4c40: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a  at4Sample *pOld.
4c50: 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71  ){.  tRowcnt nEq
4c60: 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71  New = pNew->anEq
4c70: 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20  [pNew->iCol];.  
4c80: 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d  tRowcnt nEqOld =
4c90: 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64   pOld->anEq[pOld
4ca0: 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65  ->iCol];..  asse
4cb0: 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d  rt( pOld->isPSam
4cc0: 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  ple==0 && pNew->
4cd0: 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a  isPSample==0 );.
4ce0: 20 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74    assert( IsStat
4cf0: 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c  4 || (pNew->iCol
4d00: 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f  ==0 && pOld->iCo
4d10: 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20  l==0) );..  if( 
4d20: 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20  (nEqNew>nEqOld) 
4d30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64  ) return 1;.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71  _STAT4.  if( nEq
4d60: 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20  New==nEqOld ){. 
4d70: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f     if( pNew->iCo
4d80: 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72  l<pOld->iCol ) r
4d90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
4da0: 75 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d  urn (pNew->iCol=
4db0: 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73  =pOld->iCol && s
4dc0: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73  ampleIsBetterPos
4dd0: 74 28 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20  t(pAccum, pNew, 
4de0: 70 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65  pOld));.  }.  re
4df0: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
4e00: 72 65 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d  return (nEqNew==
4e10: 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e  nEqOld && pNew->
4e20: 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73  iHash>pOld->iHas
4e30: 68 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  h);.#endif.}../*
4e40: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  .** Copy the con
4e50: 74 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20  tents of sample 
4e60: 2a 70 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70  *pNew into the p
4e70: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ->a[] array. If 
4e80: 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65  necessary,.** re
4e90: 6d 6f 76 65 20 74 68 65 20 6c 65 61 73 74 20 64  move the least d
4ea0: 65 73 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20  esirable sample 
4eb0: 66 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d  from p->a[] to m
4ec0: 61 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61  ake room..*/.sta
4ed0: 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49  tic void sampleI
4ee0: 6e 73 65 72 74 28 53 74 61 74 34 41 63 63 75 6d  nsert(Stat4Accum
4ef0: 20 2a 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65   *p, Stat4Sample
4f00: 20 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a   *pNew, int nEqZ
4f10: 65 72 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d  ero){.  Stat4Sam
4f20: 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30  ple *pSample = 0
4f30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
4f40: 73 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c  sert( IsStat4 ||
4f50: 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a   nEqZero==0 );..
4f60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4f70: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28  ABLE_STAT4.  if(
4f80: 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65   pNew->isPSample
4f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 74 34  ==0 ){.    Stat4
4fa0: 53 61 6d 70 6c 65 20 2a 70 55 70 67 72 61 64 65  Sample *pUpgrade
4fb0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
4fc0: 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65  ( pNew->anEq[pNe
4fd0: 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20  w->iCol]>0 );.. 
4fe0: 20 20 20 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c     /* This sampl
4ff0: 65 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64  e is being added
5000: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72 65   because the pre
5010: 66 69 78 20 74 68 61 74 20 65 6e 64 73 20 69 6e  fix that ends in
5020: 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20   column .    ** 
5030: 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79  iCol occurs many
5040: 20 74 69 6d 65 73 20 69 6e 20 74 68 65 20 74 61   times in the ta
5050: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ble. However, if
5060: 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
5070: 0a 20 20 20 20 2a 2a 20 61 64 64 65 64 20 61 20  .    ** added a 
5080: 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72  sample that shar
5090: 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2c 20  es this prefix, 
50a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
50b0: 20 74 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20 74   to add.    ** t
50c0: 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64  his one. Instead
50d0: 2c 20 75 70 67 72 61 64 65 20 74 68 65 20 70 72  , upgrade the pr
50e0: 69 6f 72 69 74 79 20 6f 66 20 74 68 65 20 68 69  iority of the hi
50f0: 67 68 65 73 74 20 70 72 69 6f 72 69 74 79 0a 20  ghest priority. 
5100: 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 73     ** existing s
5110: 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72 65  ample that share
5120: 73 20 74 68 69 73 20 70 72 65 66 69 78 2e 20 20  s this prefix.  
5130: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  */.    for(i=p->
5140: 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b  nSample-1; i>=0;
5150: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74 61   i--){.      Sta
5160: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d  t4Sample *pOld =
5170: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20   &p->a[i];.     
5180: 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b   if( pOld->anEq[
5190: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29  pNew->iCol]==0 )
51a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
51b0: 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29 20  ld->isPSample ) 
51c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
51d0: 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43  assert( pOld->iC
51e0: 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b  ol>pNew->iCol );
51f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5200: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5210: 70 2c 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29  p, pNew, pOld) )
5220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 55  ;.        if( pU
5230: 70 67 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d  pgrade==0 || sam
5240: 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20 70  pleIsBetter(p, p
5250: 4f 6c 64 2c 20 70 55 70 67 72 61 64 65 29 20 29  Old, pUpgrade) )
5260: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 67  {.          pUpg
5270: 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  rade = pOld;.   
5280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5290: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70     }.    if( pUp
52a0: 67 72 61 64 65 20 29 7b 0a 20 20 20 20 20 20 70  grade ){.      p
52b0: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20  Upgrade->iCol = 
52c0: 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20  pNew->iCol;.    
52d0: 20 20 70 55 70 67 72 61 64 65 2d 3e 61 6e 45 71    pUpgrade->anEq
52e0: 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d  [pUpgrade->iCol]
52f0: 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55   = pNew->anEq[pU
5300: 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20  pgrade->iCol];. 
5310: 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e       goto find_n
5320: 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  ew_min;.    }.  
5330: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
5340: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d  f necessary, rem
5350: 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20  ove sample iMin 
5360: 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
5370: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e   the new sample.
5380: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61   */.  if( p->nSa
5390: 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c  mple>=p->mxSampl
53a0: 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  e ){.    Stat4Sa
53b0: 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d  mple *pMin = &p-
53c0: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20  >a[p->iMin];.   
53d0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d   tRowcnt *anEq =
53e0: 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20   pMin->anEq;.   
53f0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d   tRowcnt *anLt =
5400: 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20   pMin->anLt;.   
5410: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20   tRowcnt *anDLt 
5420: 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20  = pMin->anDLt;. 
5430: 20 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70     sampleClear(p
5440: 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20  ->db, pMin);.   
5450: 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26   memmove(pMin, &
5460: 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28  pMin[1], sizeof(
5470: 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61  p->a[0])*(p->nSa
5480: 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29  mple-p->iMin-1))
5490: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  ;.    pSample = 
54a0: 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65  &p->a[p->nSample
54b0: 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  -1];.    pSample
54c0: 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->nRowid = 0;.  
54d0: 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20    pSample->anEq 
54e0: 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d  = anEq;.    pSam
54f0: 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44  ple->anDLt = anD
5500: 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  Lt;.    pSample-
5510: 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20  >anLt = anLt;.  
5520: 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70    p->nSample = p
5530: 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20  ->mxSample-1;.  
5540: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77  }..  /* The "row
5550: 73 20 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72  s less-than" for
5560: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
5570: 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  n must be greate
5580: 72 20 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a  r than that.  **
5590: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61   for the last sa
55a0: 6d 70 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61  mple in the p->a
55b0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
55c0: 69 73 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73  ise, the samples
55d0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f   would.  ** be o
55e0: 75 74 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a  ut of order. */.
55f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5600: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 61 73 73  ABLE_STAT4.  ass
5610: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d  ert( p->nSample=
5620: 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  =0 .       || pN
5630: 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c  ew->anLt[p->nCol
5640: 2d 31 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53  -1] > p->a[p->nS
5650: 61 6d 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d  ample-1].anLt[p-
5660: 3e 6e 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64  >nCol-1] );.#end
5670: 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  if..  /* Insert 
5680: 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a  the new sample *
5690: 2f 0a 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70  /.  pSample = &p
56a0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b  ->a[p->nSample];
56b0: 0a 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c  .  sampleCopy(p,
56c0: 20 70 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b   pSample, pNew);
56d0: 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b  .  p->nSample++;
56e0: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
56f0: 66 69 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e  first nEqZero en
5700: 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45  tries in the anE
5710: 71 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  q[] array. */.  
5720: 6d 65 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e  memset(pSample->
5730: 61 6e 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28  anEq, 0, sizeof(
5740: 74 52 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f  tRowcnt)*nEqZero
5750: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
5760: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
5770: 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65  find_new_min:.#e
5780: 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53  ndif.  if( p->nS
5790: 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70  ample>=p->mxSamp
57a0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  le ){.    int iM
57b0: 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  in = -1;.    for
57c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d  (i=0; i<p->mxSam
57d0: 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
57e0: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50   if( p->a[i].isP
57f0: 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75  Sample ) continu
5800: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69  e;.      if( iMi
5810: 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42  n<0 || sampleIsB
5820: 65 74 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69  etter(p, &p->a[i
5830: 4d 69 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20  Min], &p->a[i]) 
5840: 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20  ){.        iMin 
5850: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
5860: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
5870: 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d  Min>=0 );.    p-
5880: 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20  >iMin = iMin;.  
5890: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
58a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
58b0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
58c0: 2a 0a 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e 67  *.** Field iChng
58d0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
58e0: 69 6e 67 20 73 63 61 6e 6e 65 64 20 68 61 73 20  ing scanned has 
58f0: 63 68 61 6e 67 65 64 2e 20 53 6f 20 61 74 20 74  changed. So at t
5900: 68 69 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e  his point.** p->
5910: 63 75 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73  current contains
5920: 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20 72   a sample that r
5930: 65 66 6c 65 63 74 73 20 74 68 65 20 70 72 65 76  eflects the prev
5940: 69 6f 75 73 20 72 6f 77 20 6f 66 20 74 68 65 0a  ious row of the.
5950: 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 76 61  ** index. The va
5960: 6c 75 65 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e  lue of anEq[iChn
5970: 67 5d 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  g] and subsequen
5980: 74 20 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74  t anEq[] element
5990: 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74  s are.** correct
59a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
59b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
59c0: 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75  amplePushPreviou
59d0: 73 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  s(Stat4Accum *p,
59e0: 20 69 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69 66   int iChng){.#if
59f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5a00: 45 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 69 3b  E_STAT4.  int i;
5a10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
5a20: 61 6e 79 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d  any samples from
5a30: 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72   the aBest[] arr
5a40: 61 79 20 73 68 6f 75 6c 64 20 62 65 20 70 75 73  ay should be pus
5a50: 68 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e  hed.  ** into In
5a60: 64 65 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74  dexSample.a[] at
5a70: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f   this point.  */
5a80: 0a 20 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f  .  for(i=(p->nCo
5a90: 6c 2d 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20  l-2); i>=iChng; 
5aa0: 69 2d 2d 29 7b 0a 20 20 20 20 53 74 61 74 34 53  i--){.    Stat4S
5ab0: 61 6d 70 6c 65 20 2a 70 42 65 73 74 20 3d 20 26  ample *pBest = &
5ac0: 70 2d 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20  p->aBest[i];.   
5ad0: 20 70 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20   pBest->anEq[i] 
5ae0: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
5af0: 71 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  q[i];.    if( p-
5b00: 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61  >nSample<p->mxSa
5b10: 6d 70 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73  mple || sampleIs
5b20: 42 65 74 74 65 72 28 70 2c 20 70 42 65 73 74 2c  Better(p, pBest,
5b30: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
5b40: 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65   ){.      sample
5b50: 49 6e 73 65 72 74 28 70 2c 20 70 42 65 73 74 2c  Insert(p, pBest,
5b60: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i);.    }.  }..
5b70: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
5b80: 61 6e 45 71 5b 5d 20 66 69 65 6c 64 73 20 6f 66  anEq[] fields of
5b90: 20 61 6e 79 20 73 61 6d 70 6c 65 73 20 61 6c 72   any samples alr
5ba0: 65 61 64 79 20 63 6f 6c 6c 65 63 74 65 64 2e 20  eady collected. 
5bb0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  */.  for(i=p->nS
5bc0: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
5bd0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  --){.    int j;.
5be0: 20 20 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b      for(j=iChng;
5bf0: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
5c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
5c10: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29  [i].anEq[j]==0 )
5c20: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
5c30: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
5c40: 45 71 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Eq[j];.    }.  }
5c50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
5c60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5c70: 4c 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65  LE_STAT3) && !de
5c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
5c90: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28  BLE_STAT4).  if(
5ca0: 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20   iChng==0 ){.   
5cb0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
5cc0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30  ->current.anLt[0
5cd0: 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ];.    tRowcnt n
5ce0: 45 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Eq = p->current.
5cf0: 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  anEq[0];..    /*
5d00: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
5d10: 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64  s to be a period
5d20: 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f  ic sample. If so
5d30: 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20  , add it. */.   
5d40: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
5d50: 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71  ample)!=(nLt+nEq
5d60: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
5d70: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
5d80: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
5d90: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
5da0: 65 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ert(p, &p->curre
5db0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  nt, 0);.      p-
5dc0: 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70  >current.isPSamp
5dd0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
5de0: 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66  e ..    /* Or if
5df0: 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72   it is a non-per
5e00: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64  iodic sample. Ad
5e10: 64 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73  d it in this cas
5e20: 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66  e too. */.    if
5e30: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
5e40: 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c  mxSample .     |
5e50: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
5e60: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
5e70: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
5e80: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
5e90: 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26  ampleInsert(p, &
5ea0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a  p->current, 0);.
5eb0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5ec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5ed0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
5ee0: 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f  _STAT4.  UNUSED_
5ef0: 50 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a  PARAMETER( p );.
5f00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5f10: 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e  ER( iChng );.#en
5f20: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  dif.}../*.** Imp
5f30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5f40: 68 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c  he stat_push SQL
5f50: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74   function:  stat
5f60: 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20  _push(P,C,R).** 
5f70: 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  Arguments:.**.**
5f80: 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65      P     Pointe
5f90: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
5fa0: 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74  cum object creat
5fb0: 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28  ed by stat_init(
5fc0: 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e  ).**    C     In
5fd0: 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  dex of left-most
5fe0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65   column to diffe
5ff0: 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  r from previous 
6000: 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20  row.**    R     
6010: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  Rowid for the cu
6020: 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68  rrent row.  Migh
6030: 74 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72  t be a key recor
6040: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
6050: 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20    WITHOUT ROWID 
6060: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
6070: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  e SQL function a
6080: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55  lways returns NU
6090: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 20  LL..**.** The R 
60a0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c  parameter is onl
60b0: 79 20 75 73 65 64 20 66 6f 72 20 53 54 41 54 33  y used for STAT3
60c0: 20 61 6e 64 20 53 54 41 54 34 0a 2a 2f 0a 73 74   and STAT4.*/.st
60d0: 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 50 75  atic void statPu
60e0: 73 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  sh(.  sqlite3_co
60f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6100: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6110: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6120: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  gv.){.  int i;..
6130: 20 20 2f 2a 20 54 68 65 20 74 68 72 65 65 20 66    /* The three f
6140: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
6150: 73 20 2a 2f 0a 20 20 53 74 61 74 34 41 63 63 75  s */.  Stat4Accu
6160: 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63  m *p = (Stat4Acc
6170: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  um*)sqlite3_valu
6180: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6190: 0a 20 20 69 6e 74 20 69 43 68 6e 67 20 3d 20 73  .  int iChng = s
61a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
61b0: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e  (argv[1]);..  UN
61c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
61d0: 61 72 67 63 20 29 3b 0a 20 20 55 4e 55 53 45 44  argc );.  UNUSED
61e0: 5f 50 41 52 41 4d 45 54 45 52 28 20 63 6f 6e 74  _PARAMETER( cont
61f0: 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ext );.  assert(
6200: 20 70 2d 3e 6e 43 6f 6c 3e 31 20 29 3b 20 20 20   p->nCol>1 );   
6210: 20 20 20 20 20 2f 2a 20 49 6e 63 6c 75 64 65 73       /* Includes
6220: 20 72 6f 77 69 64 20 66 69 65 6c 64 20 2a 2f 0a   rowid field */.
6230: 20 20 61 73 73 65 72 74 28 20 69 43 68 6e 67 3c    assert( iChng<
6240: 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69 66  p->nCol );..  if
6250: 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b 0a  ( p->nRow==0 ){.
6260: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6270: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
6280: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6290: 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  Do initializatio
62a0: 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  n. */.    for(i=
62b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
62c0: 2b 29 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  +) p->current.an
62d0: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 65 6c  Eq[i] = 1;.  }el
62e0: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e  se{.    /* Secon
62f0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
6300: 20 63 61 6c 6c 73 20 67 65 74 20 70 72 6f 63 65   calls get proce
6310: 73 73 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 20  ssed here */.   
6320: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
6330: 6f 75 73 28 70 2c 20 69 43 68 6e 67 29 3b 0a 0a  ous(p, iChng);..
6340: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
6350: 44 4c 74 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61 6e  DLt[], anLt[] an
6360: 64 20 61 6e 45 71 5b 5d 20 74 6f 20 72 65 66 6c  d anEq[] to refl
6370: 65 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  ect the values t
6380: 68 61 74 20 61 70 70 6c 79 0a 20 20 20 20 2a 2a  hat apply.    **
6390: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
63a0: 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 64 65 78  row of the index
63b0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
63c0: 3b 20 69 3c 69 43 68 6e 67 3b 20 69 2b 2b 29 7b  ; i<iChng; i++){
63d0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
63e0: 74 2e 61 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20 20  t.anEq[i]++;.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 43 68   }.    for(i=iCh
6400: 6e 67 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  ng; i<p->nCol; i
6410: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75  ++){.      p->cu
6420: 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b 2b  rrent.anDLt[i]++
6430: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6440: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
6450: 53 54 41 54 34 0a 20 20 20 20 20 20 70 2d 3e 63  STAT4.      p->c
6460: 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20 2b  urrent.anLt[i] +
6470: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
6480: 71 5b 69 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  q[i];.#endif.   
6490: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
64a0: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  Eq[i] = 1;.    }
64b0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b  .  }.  p->nRow++
64c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
64d0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
64e0: 53 54 41 54 34 0a 20 20 69 66 28 20 73 71 6c 69  STAT4.  if( sqli
64f0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
6500: 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[2])==SQLITE_
6510: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 73  INTEGER ){.    s
6520: 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 49 6e 74  ampleSetRowidInt
6530: 36 34 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75  64(p->db, &p->cu
6540: 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76  rrent, sqlite3_v
6550: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
6560: 32 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2]));.  }else{. 
6570: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
6580: 64 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  d(p->db, &p->cur
6590: 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  rent, sqlite3_va
65a0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32  lue_bytes(argv[2
65b0: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
65e0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
65f0: 67 76 5b 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70  gv[2]));.  }.  p
6600: 2d 3e 63 75 72 72 65 6e 74 2e 69 48 61 73 68 20  ->current.iHash 
6610: 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69  = p->iPrn = p->i
6620: 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b  Prn*1103515245 +
6630: 20 31 32 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a   12345;.#endif..
6640: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6650: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20  ABLE_STAT4.  {. 
6660: 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d     tRowcnt nLt =
6670: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74   p->current.anLt
6680: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20  [p->nCol-1];..  
6690: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
66a0: 69 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65  is is to be a pe
66b0: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49  riodic sample. I
66c0: 66 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f  f so, add it. */
66d0: 0a 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d  .    if( (nLt/p-
66e0: 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74  >nPSample)!=(nLt
66f0: 2b 31 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20  +1)/p->nPSample 
6700: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
6710: 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20  ent.isPSample = 
6720: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  1;.      p->curr
6730: 65 6e 74 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ent.iCol = 0;.  
6740: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6750: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
6760: 20 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20   p->nCol-1);.   
6770: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6780: 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20  PSample = 0;.   
6790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
67a0: 65 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  e the aBest[] ar
67b0: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ray. */.    for(
67c0: 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d  i=0; i<(p->nCol-
67d0: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
67e0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
67f0: 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = i;.      if( i
6800: 3e 3d 69 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c  >=iChng || sampl
6810: 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70 2c  eIsBetterPost(p,
6820: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70   &p->current, &p
6830: 2d 3e 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20  ->aBest[i]) ){. 
6840: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70         sampleCop
6850: 79 28 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  y(p, &p->aBest[i
6860: 5d 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b  ], &p->current);
6870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6880: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74   }.#endif.}.stat
6890: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
68a0: 20 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66   statPushFuncdef
68b0: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33   = {.  2+IsStat3
68c0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
68d0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
68e0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
68f0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
6900: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
6910: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
6930: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75  Next */.  statPu
6940: 73 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46  sh,        /* xF
6950: 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  unc */.  0,     
6960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74            /* xSt
6970: 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ep */.  0,      
6980: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
6990: 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74  alize */.  "stat
69a0: 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a  _push",     /* z
69b0: 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Name */.  0,    
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 48             /* pH
69d0: 61 73 68 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ash */.  0      
69e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65            /* pDe
69f0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a  structor */.};..
6a00: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
6a10: 5f 53 54 41 54 31 20 30 20 20 20 20 20 20 20 20  _STAT1 0        
6a20: 20 20 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c 75    /* "stat" colu
6a30: 6d 6e 20 6f 66 20 73 74 61 74 31 20 74 61 62 6c  mn of stat1 tabl
6a40: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41  e */.#define STA
6a50: 54 5f 47 45 54 5f 52 4f 57 49 44 20 31 20 20 20  T_GET_ROWID 1   
6a60: 20 20 20 20 20 20 20 2f 2a 20 22 72 6f 77 69 64         /* "rowid
6a70: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74  " column of stat
6a80: 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64  [34] entry */.#d
6a90: 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e  efine STAT_GET_N
6aa0: 45 51 20 20 20 32 20 20 20 20 20 20 20 20 20 20  EQ   2          
6ab0: 2f 2a 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e 20  /* "neq" column 
6ac0: 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72  of stat[34] entr
6ad0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41  y */.#define STA
6ae0: 54 5f 47 45 54 5f 4e 4c 54 20 20 20 33 20 20 20  T_GET_NLT   3   
6af0: 20 20 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22 20         /* "nlt" 
6b00: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
6b10: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
6b20: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c  ine STAT_GET_NDL
6b30: 54 20 20 34 20 20 20 20 20 20 20 20 20 20 2f 2a  T  4          /*
6b40: 20 22 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f   "ndlt" column o
6b50: 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79  f stat[34] entry
6b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
6b70: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6b80: 20 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 53   stat_get(P,J) S
6b90: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
6ba0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6bb0: 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 74   used to query t
6bc0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e  he results.  Con
6bd0: 74 65 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64  tent is returned
6be0: 20 66 6f 72 20 70 61 72 61 6d 65 74 65 72 20 4a   for parameter J
6bf0: 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 65  .** which is one
6c00: 20 6f 66 20 74 68 65 20 53 54 41 54 5f 47 45 54   of the STAT_GET
6c10: 5f 78 78 78 78 20 76 61 6c 75 65 73 20 64 65 66  _xxxx values def
6c20: 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
6c30: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 53 54 41  * If neither STA
6c40: 54 33 20 6e 6f 72 20 53 54 41 54 34 20 61 72 65  T3 nor STAT4 are
6c50: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a   enabled, then J
6c60: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54   is always.** ST
6c70: 41 54 5f 47 45 54 5f 53 54 41 54 31 20 61 6e 64  AT_GET_STAT1 and
6c80: 20 69 73 20 68 65 6e 63 65 20 6f 6d 69 74 74 65   is hence omitte
6c90: 64 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  d and this routi
6ca0: 6e 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  ne becomes.** a 
6cb0: 6f 6e 65 2d 70 61 72 61 6d 65 74 65 72 20 66 75  one-parameter fu
6cc0: 6e 63 74 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74  nction, stat_get
6cd0: 28 50 29 2c 20 74 68 61 74 20 61 6c 77 61 79 73  (P), that always
6ce0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
6cf0: 73 74 61 74 31 20 74 61 62 6c 65 20 65 6e 74 72  stat1 table entr
6d00: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  y information..*
6d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
6d20: 61 74 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33  atGet(.  sqlite3
6d30: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6d40: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6d50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6d60: 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 34  *argv.){.  Stat4
6d70: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
6d80: 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  4Accum*)sqlite3_
6d90: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6da0: 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0]);.#ifdef SQLI
6db0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
6dc0: 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 54  OR_STAT4.  /* ST
6dd0: 41 54 33 20 61 6e 64 20 53 54 41 54 34 20 68 61  AT3 and STAT4 ha
6de0: 76 65 20 61 20 70 61 72 61 6d 65 74 65 72 20 6f  ve a parameter o
6df0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  n this routine. 
6e00: 2a 2f 0a 20 20 69 6e 74 20 65 43 61 6c 6c 20 3d  */.  int eCall =
6e10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6e20: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61  nt(argv[1]);.  a
6e30: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29  ssert( argc==2 )
6e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43 61 6c  ;.  assert( eCal
6e50: 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54  l==STAT_GET_STAT
6e60: 31 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54  1 || eCall==STAT
6e70: 5f 47 45 54 5f 4e 45 51 20 0a 20 20 20 20 20 20  _GET_NEQ .      
6e80: 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f   || eCall==STAT_
6e90: 47 45 54 5f 52 4f 57 49 44 20 7c 7c 20 65 43 61  GET_ROWID || eCa
6ea0: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 4c 54  ll==STAT_GET_NLT
6eb0: 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c  .       || eCall
6ec0: 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20  ==STAT_GET_NDLT 
6ed0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 65 43 61 6c  .  );.  if( eCal
6ee0: 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54  l==STAT_GET_STAT
6ef0: 31 20 29 0a 23 65 6c 73 65 0a 20 20 61 73 73 65  1 ).#else.  asse
6f00: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 23  rt( argc==1 );.#
6f10: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 2f 2a  endif.  {.    /*
6f20: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
6f30: 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68  e to store in th
6f40: 65 20 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20  e "stat" column 
6f50: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
6f60: 61 74 31 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  at1.    ** table
6f70: 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e   for this index.
6f80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6f90: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  he value is a st
6fa0: 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66  ring composed of
6fb0: 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67   a list of integ
6fc0: 65 72 73 20 64 65 73 63 72 69 62 69 6e 67 20 0a  ers describing .
6fd0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
6fe0: 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  . The first inte
6ff0: 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ger in the list 
7000: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
7010: 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20 65  ber of .    ** e
7020: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e  ntries in the in
7030: 64 65 78 2e 20 54 68 65 72 65 20 69 73 20 6f 6e  dex. There is on
7040: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74  e additional int
7050: 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  eger in the list
7060: 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63   .    ** for eac
7070: 68 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  h indexed column
7080: 2e 20 54 68 69 73 20 61 64 64 69 74 69 6f 6e 61  . This additiona
7090: 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61 6e 20  l integer is an 
70a0: 65 73 74 69 6d 61 74 65 20 6f 66 0a 20 20 20 20  estimate of.    
70b0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
70c0: 20 72 6f 77 73 20 6d 61 74 63 68 65 64 20 62 79   rows matched by
70d0: 20 61 20 73 74 61 62 62 69 6e 67 20 71 75 65 72   a stabbing quer
70e0: 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 75  y on the index u
70f0: 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 6b 65  sing.    ** a ke
7100: 79 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  y with the corre
7110: 73 70 6f 6e 64 69 6e 67 20 6e 75 6d 62 65 72 20  sponding number 
7120: 6f 66 20 66 69 65 6c 64 73 2e 20 49 6e 20 6f 74  of fields. In ot
7130: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 2a  her words,.    *
7140: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  * if the index i
7150: 73 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28 61 2c  s on columns (a,
7160: 62 29 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  b) and the sqlit
7170: 65 5f 73 74 61 74 31 20 76 61 6c 75 65 20 69 73  e_stat1 value is
7180: 20 0a 20 20 20 20 2a 2a 20 22 31 30 30 20 31 30   .    ** "100 10
7190: 20 32 22 2c 20 74 68 65 6e 20 53 51 4c 69 74 65   2", then SQLite
71a0: 20 65 73 74 69 6d 61 74 65 73 20 74 68 61 74 3a   estimates that:
71b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
71c0: 20 2a 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e   * the index con
71d0: 74 61 69 6e 73 20 31 30 30 20 72 6f 77 73 2c 0a  tains 100 rows,.
71e0: 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52      **   * "WHER
71f0: 45 20 61 3d 3f 22 20 6d 61 74 63 68 65 73 20 31  E a=?" matches 1
7200: 30 20 72 6f 77 73 2c 20 61 6e 64 0a 20 20 20 20  0 rows, and.    
7210: 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20 61 3d  **   * "WHERE a=
7220: 3f 20 41 4e 44 20 62 3d 3f 22 20 6d 61 74 63 68  ? AND b=?" match
7230: 65 73 20 32 20 72 6f 77 73 2e 0a 20 20 20 20 2a  es 2 rows..    *
7240: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 44 20 69 73  *.    ** If D is
7250: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69   the count of di
7260: 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 61 6e  stinct values an
7270: 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74 61 6c  d K is the total
7280: 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
7290: 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 65 61  ** rows, then ea
72a0: 63 68 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  ch estimate is c
72b0: 6f 6d 70 75 74 65 64 20 61 73 3a 0a 20 20 20 20  omputed as:.    
72c0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
72d0: 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20   I = (K+D-1)/D. 
72e0: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
72f0: 7a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  z;.    int i;.. 
7300: 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20     char *zRet = 
7310: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
7320: 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b  o(p->nCol * 25);
7330: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
7340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7350: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7360: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
7370: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7380: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
7390: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65  snprintf(24, zRe
73a0: 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29  t, "%llu", (u64)
73b0: 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20  p->nRow);.    z 
73c0: 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33  = zRet + sqlite3
73d0: 53 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a  Strlen30(zRet);.
73e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
73f0: 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29  p->nCol-1); i++)
7400: 7b 0a 20 20 20 20 20 20 75 36 34 20 6e 44 69 73  {.      u64 nDis
7410: 74 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65  tinct = p->curre
7420: 6e 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b  nt.anDLt[i] + 1;
7430: 0a 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20  .      u64 iVal 
7440: 3d 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69  = (p->nRow + nDi
7450: 73 74 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44  stinct - 1) / nD
7460: 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73  istinct;.      s
7470: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7480: 32 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20  24, z, " %llu", 
7490: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b  iVal);.      z +
74a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
74b0: 30 28 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  0(z);.      asse
74c0: 72 74 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  rt( p->current.a
74d0: 6e 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a  nEq[i] );.    }.
74e0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
74f0: 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74  =='\0' && z>zRet
7500: 20 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   );..    sqlite3
7510: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7520: 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20  text, zRet, -1, 
7530: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
7540: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7550: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
7560: 5f 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66  _STAT4.  else if
7570: 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  ( eCall==STAT_GE
7580: 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69  T_ROWID ){.    i
7590: 66 28 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a  f( p->iGet<0 ){.
75a0: 20 20 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68        samplePush
75b0: 50 72 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a  Previous(p, 0);.
75c0: 20 20 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20        p->iGet = 
75d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
75e0: 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d   p->iGet<p->nSam
75f0: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ple ){.      Sta
7600: 74 34 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70  t4Sample *pS = p
7610: 2d 3e 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20  ->a + p->iGet;. 
7620: 20 20 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f       if( pS->nRo
7630: 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wid==0 ){.      
7640: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7650: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
7660: 70 53 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20  pS->u.iRowid);. 
7670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7680: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7690: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
76a0: 20 70 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70   pS->u.aRowid, p
76b0: 53 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20  S->nRowid,.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
76e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
76f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
7700: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43  .    tRowcnt *aC
7710: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  nt = 0;..    ass
7720: 65 72 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e  ert( p->iGet<p->
7730: 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73  nSample );.    s
7740: 77 69 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a  witch( eCall ){.
7750: 20 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f        case STAT_
7760: 47 45 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d  GET_NEQ:  aCnt =
7770: 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61   p->a[p->iGet].a
7780: 6e 45 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  nEq; break;.    
7790: 20 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f    case STAT_GET_
77a0: 4e 4c 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e  NLT:  aCnt = p->
77b0: 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b  a[p->iGet].anLt;
77c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
77d0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
77e0: 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e   aCnt = p->a[p->
77f0: 69 47 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20  iGet].anDLt; .  
7800: 20 20 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b        p->iGet++;
7810: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7830: 20 20 20 69 66 28 20 49 73 53 74 61 74 33 20 29     if( IsStat3 )
7840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7850: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
7860: 74 65 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b  text, (i64)aCnt[
7870: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
7880: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74        char *zRet
7890: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
78a0: 5a 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32  Zero(p->nCol * 2
78b0: 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  5);.      if( zR
78c0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
78d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
78e0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
78f0: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
7900: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
7910: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
7920: 7a 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20  z = zRet;.      
7930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7940: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7960: 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25  printf(24, z, "%
7970: 6c 6c 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74  llu ", (u64)aCnt
7980: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
7990: 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
79a0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20  en30(z);.       
79b0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
79c0: 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26  t( z[0]=='\0' &&
79d0: 20 7a 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20   z>zRet );.     
79e0: 20 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b     z[-1] = '\0';
79f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7a00: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7a10: 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20  text, zRet, -1, 
7a20: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
7a30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7a50: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
7a60: 52 5f 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64  R_STAT4 */.#ifnd
7a70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7a80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7a90: 45 52 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64  ER( argc );.#end
7aa0: 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73  if.}.static cons
7ab0: 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 47 65  t FuncDef statGe
7ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31  tFuncdef = {.  1
7ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
7ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
7af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
7b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
7b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
7b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
7b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
7b50: 20 20 73 74 61 74 47 65 74 2c 20 20 20 20 20 20    statGet,      
7b60: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
7b70: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7b80: 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20    /* xStep */.  
7b90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7ba0: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
7bb0: 0a 20 20 22 73 74 61 74 5f 67 65 74 22 2c 20 20  .  "stat_get",  
7bc0: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
7bd0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7be0: 20 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20     /* pHash */. 
7bf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7c00: 20 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72    /* pDestructor
7c10: 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76   */.};..static v
7c20: 6f 69 64 20 63 61 6c 6c 53 74 61 74 47 65 74 28  oid callStatGet(
7c30: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67  Vdbe *v, int reg
7c40: 53 74 61 74 34 2c 20 69 6e 74 20 69 50 61 72 61  Stat4, int iPara
7c50: 6d 2c 20 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a  m, int regOut){.
7c60: 20 20 61 73 73 65 72 74 28 20 72 65 67 4f 75 74    assert( regOut
7c70: 21 3d 72 65 67 53 74 61 74 34 20 26 26 20 72 65  !=regStat4 && re
7c80: 67 4f 75 74 21 3d 72 65 67 53 74 61 74 34 2b 31  gOut!=regStat4+1
7c90: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
7ca0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
7cb0: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
7cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7cd0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 50 61 72 61  P_Integer, iPara
7ce0: 6d 2c 20 72 65 67 53 74 61 74 34 2b 31 29 3b 0a  m, regStat4+1);.
7cf0: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 44 45 42  #elif SQLITE_DEB
7d00: 55 47 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  UG.  assert( iPa
7d10: 72 61 6d 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  ram==STAT_GET_ST
7d20: 41 54 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  AT1 );.#else.  U
7d30: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7d40: 20 69 50 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69   iParam );.#endi
7d50: 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
7d60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp3(v, OP_Func
7d70: 74 69 6f 6e 2c 20 30 2c 20 72 65 67 53 74 61 74  tion, 0, regStat
7d80: 34 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 73 71  4, regOut);.  sq
7d90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7da0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
7db0: 26 73 74 61 74 47 65 74 46 75 6e 63 64 65 66 2c  &statGetFuncdef,
7dc0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
7dd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7de0: 65 50 35 28 76 2c 20 31 20 2b 20 49 73 53 74 61  eP5(v, 1 + IsSta
7df0: 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  t34);.}../*.** G
7e00: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
7e10: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
7e20: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  f all indices as
7e30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
7e40: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
7e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e60: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
7e70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7e80: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
7e90: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
7ea0: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
7eb0: 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63  able whose indic
7ec0: 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61  es are to be ana
7ed0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
7ee0: 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49   *pOnlyIdx, /* I
7ef0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79  f not NULL, only
7f00: 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e   analyze this on
7f10: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
7f20: 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a   iStatCur,    /*
7f30: 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75   Index of VdbeCu
7f40: 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65 73  rsor that writes
7f50: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
7f60: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  1 table */.  int
7f70: 20 69 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a   iMem,        /*
7f80: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
7f90: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69  y locations begi
7fa0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
7fb0: 69 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20  iTab         /* 
7fc0: 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63  Next available c
7fd0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ursor */.){.  sq
7fe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7ff0: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61  se->db;    /* Da
8000: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
8010: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
8040: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
8050: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
8080: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  n index being an
8090: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
80a0: 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
80b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
80c0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64  e cursor */.  Vd
80d0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
80e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
80f0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8100: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
8110: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8140: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72  er */.  int jZer
8150: 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20  oRows = -1;     
8160: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
8170: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
8180: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
8190: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
81c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
81d0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20  ng pTab */.  u8 
81e0: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31  needTableCnt = 1
81f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
8200: 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74  e to count the t
8210: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
8220: 67 4e 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d  gNewRowid = iMem
8230: 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ++;    /* Rowid 
8240: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 65 64  for the inserted
8250: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
8260: 20 72 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d   regStat4 = iMem
8270: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ++;       /* Reg
8280: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74  ister to hold St
8290: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
82a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67  */.  int regChng
82b0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
82c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
82d0: 61 6e 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c  anged index fiel
82e0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
82f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8300: 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 72  OR_STAT4.  int r
8310: 65 67 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b  egRowid = iMem++
8320: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
8330: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
8340: 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28 29 20   to stat_push() 
8350: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
8360: 72 65 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b  regTemp = iMem++
8370: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ;        /* Temp
8380: 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
8390: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54  er */.  int regT
83a0: 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b  abname = iMem++;
83b0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
83c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
83d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
83e0: 72 65 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65  regIdxname = iMe
83f0: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8400: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8410: 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  index name */.  
8420: 69 6e 74 20 72 65 67 53 74 61 74 31 20 3d 20 69  int regStat1 = i
8430: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8440: 56 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 74  Value for the st
8450: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c  at column of sql
8460: 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 69  ite_stat1 */.  i
8470: 6e 74 20 72 65 67 50 72 65 76 20 3d 20 69 4d 65  nt regPrev = iMe
8480: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  m;          /* M
8490: 55 53 54 20 42 45 20 4c 41 53 54 20 28 73 65 65  UST BE LAST (see
84a0: 20 62 65 6c 6f 77 29 20 2a 2f 0a 0a 20 20 70 50   below) */..  pP
84b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
84c0: 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 69  (pParse->nMem, i
84d0: 4d 65 6d 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  Mem);.  v = sqli
84e0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
84f0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  e);.  if( v==0 |
8500: 7c 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  | NEVER(pTab==0)
8510: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
8520: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
8530: 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  tnum==0 ){.    /
8540: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
8550: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69  statistics on vi
8560: 65 77 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ews or virtual t
8570: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  ables */.    ret
8580: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  urn;.  }.  if( s
8590: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
85a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
85b0: 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
85c0: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67  .    /* Do not g
85d0: 61 74 68 65 72 20 73 74 61 74 69 73 74 69 63 73  ather statistics
85e0: 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65   on system table
85f0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  s */.    return;
8600: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
8610: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
8620: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
8630: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
8640: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
8650: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
8660: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
8670: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
8680: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
8690: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
86a0: 20 30 29 20 29 3b 0a 23 69 66 6e 64 65 66 20 53   0) );.#ifndef S
86b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
86c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
86d0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
86e0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41  pParse, SQLITE_A
86f0: 4e 41 4c 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e  NALYZE, pTab->zN
8700: 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
8710: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
8720: 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
8730: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8740: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72  /* Establish a r
8750: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
8760: 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61  table at the sha
8770: 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e  red-cache level.
8780: 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65   .  ** Open a re
8790: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
87a0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73  n the table. Als
87b0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  o allocate a cur
87c0: 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  sor number.  ** 
87d0: 74 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e  to use for scann
87e0: 69 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64  ing indexes (iId
87f0: 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20  xCur). No index 
8800: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
8810: 20 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69   at.  ** this ti
8820: 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20  me though.  */. 
8830: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
8840: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
8850: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
8860: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54  ab->zName);.  iT
8870: 61 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  abCur = iTab++;.
8880: 20 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62    iIdxCur = iTab
8890: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ++;.  pParse->nT
88a0: 61 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  ab = MAX(pParse-
88b0: 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20  >nTab, iTab);.  
88c0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
88d0: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
88e0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
88f0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c  OpenRead);.  sql
8900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8910: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
8920: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 30 2c 20   regTabname, 0, 
8930: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
8940: 0a 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ..  for(pIdx=pTa
8950: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
8960: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8970: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c  t){.    int nCol
8980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
89a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 64 65 78  of columns index
89b0: 65 64 20 62 79 20 70 49 64 78 20 2a 2f 0a 20 20  ed by pIdx */.  
89c0: 20 20 69 6e 74 20 2a 61 47 6f 74 6f 43 68 6e 67    int *aGotoChng
89d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
89e0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a 75 6d 70  /* Array of jump
89f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
8a00: 72 65 73 73 65 73 20 2a 2f 0a 20 20 20 20 69 6e  resses */.    in
8a10: 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20  t addrRewind;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8a30: 64 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65  ddress of "OP_Re
8a40: 77 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f  wind iIdxCur" */
8a50: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74  .    int addrGot
8a60: 6f 43 68 6e 67 30 3b 20 20 20 20 20 20 20 20 20  oChng0;         
8a70: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
8a80: 20 22 47 6f 74 6f 20 61 64 64 72 5f 63 68 6e 67   "Goto addr_chng
8a90: 5f 30 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  _0" */.    int a
8aa0: 64 64 72 4e 65 78 74 52 6f 77 3b 20 20 20 20 20  ddrNextRow;     
8ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8ac0: 65 73 73 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77  ess of "next_row
8ad0: 3a 22 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  :" */.    const 
8ae0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 3b 20  char *zIdxName; 
8af0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8b00: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
8b10: 0a 20 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64  .    if( pOnlyId
8b20: 78 20 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70  x && pOnlyIdx!=p
8b30: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
8b40: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50      if( pIdx->pP
8b50: 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29  artIdxWhere==0 )
8b60: 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20   needTableCnt = 
8b70: 30 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  0;.    VdbeNoopC
8b80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
8b90: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 25 73  n analysis of %s
8ba0: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
8bb0: 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64  ;.    nCol = pId
8bc0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
8bd0: 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71 6c 69  aGotoChng = sqli
8be0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8bf0: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
8c00: 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 69 66  nCol+1));.    if
8c10: 28 20 61 47 6f 74 6f 43 68 6e 67 3d 3d 30 20 29  ( aGotoChng==0 )
8c20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
8c30: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
8c40: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
8c50: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ing the index na
8c60: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  me. */.    if( p
8c70: 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d  Idx->autoIndex==
8c80: 32 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70  2 && !HasRowid(p
8c90: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 49  Tab) ){.      zI
8ca0: 64 78 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  dxName = pTab->z
8cb0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Name;.    }else{
8cc0: 0a 20 20 20 20 20 20 7a 49 64 78 4e 61 6d 65 20  .      zIdxName 
8cd0: 3d 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pIdx->zName;. 
8ce0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8cf0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8d00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67  _String8, 0, reg
8d10: 49 64 78 6e 61 6d 65 2c 20 30 2c 20 7a 49 64 78  Idxname, 0, zIdx
8d20: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  Name, 0);..    /
8d30: 2a 0a 20 20 20 20 2a 2a 20 50 73 65 75 64 6f 2d  *.    ** Pseudo-
8d40: 63 6f 64 65 20 66 6f 72 20 6c 6f 6f 70 20 74 68  code for loop th
8d50: 61 74 20 63 61 6c 6c 73 20 73 74 61 74 5f 70 75  at calls stat_pu
8d60: 73 68 28 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  sh():.    **.   
8d70: 20 2a 2a 20 20 20 52 65 77 69 6e 64 20 63 73 72   **   Rewind csr
8d80: 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 65 6f 66  .    **   if eof
8d90: 28 63 73 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  (csr) goto end_o
8da0: 66 5f 73 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20  f_scan;.    **  
8db0: 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20   regChng = 0.   
8dc0: 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f   **   goto chng_
8dd0: 61 64 64 72 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20  addr_0;.    **. 
8de0: 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a     **  next_row:
8df0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
8e00: 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 69  g = 0.    **   i
8e10: 66 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67  f( idx(0) != reg
8e20: 50 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63  Prev(0) ) goto c
8e30: 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 2a  hng_addr_0.    *
8e40: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31 0a  *   regChng = 1.
8e50: 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78      **   if( idx
8e60: 28 31 29 20 21 3d 20 72 65 67 50 72 65 76 28 31  (1) != regPrev(1
8e70: 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64  ) ) goto chng_ad
8e80: 64 72 5f 31 0a 20 20 20 20 2a 2a 20 20 20 2e 2e  dr_1.    **   ..
8e90: 2e 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68  ..    **   regCh
8ea0: 6e 67 20 3d 20 4e 0a 20 20 20 20 2a 2a 20 20 20  ng = N.    **   
8eb0: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 4e  goto chng_addr_N
8ec0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8ed0: 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20  chng_addr_0:.   
8ee0: 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30 29   **   regPrev(0)
8ef0: 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20 2a 2a   = idx(0).    **
8f00: 20 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20    chng_addr_1:. 
8f10: 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28     **   regPrev(
8f20: 31 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20  1) = idx(1).    
8f30: 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20  **  ....    **. 
8f40: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
8f50: 5f 4e 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _N:.    **   reg
8f60: 52 6f 77 69 64 20 3d 20 69 64 78 28 72 6f 77 69  Rowid = idx(rowi
8f70: 64 29 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74  d).    **   stat
8f80: 5f 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67  _push(P, regChng
8f90: 2c 20 72 65 67 52 6f 77 69 64 29 0a 20 20 20 20  , regRowid).    
8fa0: 2a 2a 20 20 20 4e 65 78 74 20 63 73 72 0a 20 20  **   Next csr.  
8fb0: 20 20 2a 2a 20 20 20 69 66 20 21 65 6f 66 28 63    **   if !eof(c
8fc0: 73 72 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f  sr) goto next_ro
8fd0: 77 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w;.    **.    **
8fe0: 20 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20    end_of_scan:. 
8ff0: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61     */..    /* Ma
9000: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 61 72  ke sure there ar
9010: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
9020: 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 20  cells allocated 
9030: 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 0a  to accommodate .
9040: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 67 50 72      ** the regPr
9050: 65 76 20 61 72 72 61 79 20 61 6e 64 20 61 20 74  ev array and a t
9060: 72 61 69 6c 69 6e 67 20 72 6f 77 69 64 20 28 74  railing rowid (t
9070: 68 65 20 72 6f 77 69 64 20 73 6c 6f 74 20 69 73  he rowid slot is
9080: 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
9090: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 61   when building a
90a0: 20 72 65 63 6f 72 64 20 74 6f 20 69 6e 73 65 72   record to inser
90b0: 74 20 69 6e 74 6f 20 74 68 65 20 73 61 6d 70 6c  t into the sampl
90c0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 0a 20 20 20  e column of .   
90d0: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73   ** the sqlite_s
90e0: 74 61 74 34 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tat4 table.  */.
90f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9100: 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e   = MAX(pParse->n
9110: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 6e 43 6f  Mem, regPrev+nCo
9120: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  l);..    /* Open
9130: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
9140: 73 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  sor on the index
9150: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e   being analyzed.
9160: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9170: 69 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65  iDb==sqlite3Sche
9180: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
9190: 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  dx->pSchema) );.
91a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
91c0: 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
91d0: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
91e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91f0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
9200: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
9210: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
9220: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
9230: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76  e));..    /* Inv
9240: 6f 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e 69  oke the stat_ini
9250: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  t() function. Th
9260: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 3a  e arguments are:
9270: 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
9280: 20 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62 65     (1) the numbe
9290: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
92a0: 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75 64  the index includ
92b0: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2c 0a 20  ing the rowid,. 
92c0: 20 20 20 2a 2a 20 20 20 20 28 32 29 20 74 68 65     **    (2) the
92d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
92e0: 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
92f0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
9300: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
9310: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
9320: 20 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34   STAT3 and STAT4
9330: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
9340: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9350: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
9360: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9370: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
9380: 49 64 78 43 75 72 2c 20 72 65 67 53 74 61 74 34  IdxCur, regStat4
9390: 2b 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  +2);.#endif.    
93a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
93b0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
93c0: 20 6e 43 6f 6c 2b 31 2c 20 72 65 67 53 74 61 74   nCol+1, regStat
93d0: 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
93e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
93f0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 72  P_Function, 0, r
9400: 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67 53 74  egStat4+1, regSt
9410: 61 74 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  at4);.    sqlite
9420: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
9430: 20 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61   -1, (char*)&sta
9440: 74 49 6e 69 74 46 75 6e 63 64 65 66 2c 20 50 34  tInitFuncdef, P4
9450: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
9460: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9470: 50 35 28 76 2c 20 31 2b 49 73 53 74 61 74 33 34  P5(v, 1+IsStat34
9480: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6d 70 6c 65  );..    /* Imple
9490: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
94a0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
94b0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69  **.    **   Rewi
94c0: 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20  nd csr.    **   
94d0: 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f  if eof(csr) goto
94e0: 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20   end_of_scan;.  
94f0: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
9500: 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f   0.    **   goto
9510: 20 6e 65 78 74 5f 70 75 73 68 5f 30 3b 0a 20 20   next_push_0;.  
9520: 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
9530: 61 64 64 72 52 65 77 69 6e 64 20 3d 20 73 71 6c  addrRewind = sql
9540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
9550: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64  , OP_Rewind, iId
9560: 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43  xCur);.    VdbeC
9570: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9590: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
95a0: 20 30 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20   0, regChng);.  
95b0: 20 20 61 64 64 72 47 6f 74 6f 43 68 6e 67 30 20    addrGotoChng0 
95c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
95d0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
95e0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
95f0: 20 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a   next_row:.    *
9600: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a  *   regChng = 0.
9610: 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78      **   if( idx
9620: 28 30 29 20 21 3d 20 72 65 67 50 72 65 76 28 30  (0) != regPrev(0
9630: 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64  ) ) goto chng_ad
9640: 64 72 5f 30 0a 20 20 20 20 2a 2a 20 20 20 72 65  dr_0.    **   re
9650: 67 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a  gChng = 1.    **
9660: 20 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d     if( idx(1) !=
9670: 20 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f   regPrev(1) ) go
9680: 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20  to chng_addr_1. 
9690: 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20     **   ....    
96a0: 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e  **   regChng = N
96b0: 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63  .    **   goto c
96c0: 68 6e 67 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a  hng_addr_N.    *
96d0: 2f 0a 20 20 20 20 61 64 64 72 4e 65 78 74 52 6f  /.    addrNextRo
96e0: 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
96f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
9700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
9710: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
9720: 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d 20 28 63  char *pColl = (c
9730: 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61  har*)sqlite3Loca
9740: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
9750: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
9760: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
9770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9780: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 72 65  P_Integer, i, re
9790: 67 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 73 71  gChng);.      sq
97a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
97b0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
97c0: 64 78 43 75 72 2c 20 69 2c 20 72 65 67 54 65 6d  dxCur, i, regTem
97d0: 70 29 3b 0a 20 20 20 20 20 20 61 47 6f 74 6f 43  p);.      aGotoC
97e0: 68 6e 67 5b 69 5d 20 3d 20 0a 20 20 20 20 20 20  hng[i] = .      
97f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9800: 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 54  4(v, OP_Ne, regT
9810: 65 6d 70 2c 20 30 2c 20 72 65 67 50 72 65 76 2b  emp, 0, regPrev+
9820: 69 2c 20 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  i, pColl, P4_COL
9830: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 73 71 6c  LSEQ);.      sql
9840: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9850: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
9860: 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
9870: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
9880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
98a0: 65 67 65 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 43  eger, nCol, regC
98b0: 68 6e 67 29 3b 0a 20 20 20 20 61 47 6f 74 6f 43  hng);.    aGotoC
98c0: 68 6e 67 5b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  hng[nCol] = sqli
98d0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
98e0: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20 20   OP_Goto);..    
98f0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  /*.    **  chng_
9900: 61 64 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20  addr_0:.    **  
9910: 20 72 65 67 50 72 65 76 28 30 29 20 3d 20 69 64   regPrev(0) = id
9920: 78 28 30 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e  x(0).    **  chn
9930: 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a  g_addr_1:.    **
9940: 20 20 20 72 65 67 50 72 65 76 28 31 29 20 3d 20     regPrev(1) = 
9950: 69 64 78 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e  idx(1).    **  .
9960: 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ...    */.    sq
9970: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
9980: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 43 68 6e  e(v, addrGotoChn
9990: 67 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  g0);.    for(i=0
99a0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
99b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
99c0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 47 6f  eJumpHere(v, aGo
99d0: 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  toChng[i]);.    
99e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
99f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9a00: 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72 65  , iIdxCur, i, re
9a10: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 7d 0a  gPrev+i);.    }.
9a20: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
9a30: 63 68 6e 67 5f 61 64 64 72 5f 4e 3a 0a 20 20 20  chng_addr_N:.   
9a40: 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d   **   regRowid =
9a50: 20 69 64 78 28 72 6f 77 69 64 29 20 20 20 20 20   idx(rowid)     
9a60: 20 20 20 20 20 20 20 2f 2f 20 53 54 41 54 33 34         // STAT34
9a70: 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 73   only.    **   s
9a80: 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65 67 43  tat_push(P, regC
9a90: 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29 20 20  hng, regRowid)  
9aa0: 2f 2f 20 33 72 64 20 70 61 72 61 6d 65 74 65 72  // 3rd parameter
9ab0: 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20   STAT34 only.   
9ac0: 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72 0a 20   **   Next csr. 
9ad0: 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f 66 28     **   if !eof(
9ae0: 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72  csr) goto next_r
9af0: 6f 77 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ow;.    */.    s
9b00: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
9b10: 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b  re(v, aGotoChng[
9b20: 6e 43 6f 6c 5d 29 3b 0a 23 69 66 64 65 66 20 53  nCol]);.#ifdef S
9b30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9b40: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
9b50: 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 69 64  assert( regRowid
9b60: 3d 3d 28 72 65 67 53 74 61 74 34 2b 32 29 20 29  ==(regStat4+2) )
9b70: 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77  ;.    if( HasRow
9b80: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
9b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ba0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
9bb0: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  id, iIdxCur, reg
9bc0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
9bd0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
9be0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
9bf0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
9c00: 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  x->pTable);.    
9c10: 20 20 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b    int j, k, regK
9c20: 65 79 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79  ey;.      regKey
9c30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9c40: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
9c50: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
9c60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9c70: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
9c80: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
9c90: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
9ca0: 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
9cb0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
9cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9cd0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9ce0: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
9cf0: 20 72 65 67 4b 65 79 2b 6a 29 3b 0a 20 20 20 20   regKey+j);.    
9d00: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9d10: 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e  (v, "%s", pTab->
9d20: 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75  aCol[pPk->aiColu
9d30: 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
9d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9d60: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9d70: 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e  , regKey, pPk->n
9d80: 4b 65 79 43 6f 6c 2c 20 72 65 67 52 6f 77 69 64  KeyCol, regRowid
9d90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9da0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
9db0: 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c  (pParse, regKey,
9dc0: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
9dd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9de0: 20 61 73 73 65 72 74 28 20 72 65 67 43 68 6e 67   assert( regChng
9df0: 3d 3d 28 72 65 67 53 74 61 74 34 2b 31 29 20 29  ==(regStat4+1) )
9e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75  eAddOp3(v, OP_Fu
9e20: 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74  nction, 1, regSt
9e30: 61 74 34 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20  at4, regTemp);. 
9e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9e50: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
9e60: 68 61 72 2a 29 26 73 74 61 74 50 75 73 68 46 75  har*)&statPushFu
9e70: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
9e80: 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
9e90: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32  dbeChangeP5(v, 2
9ea0: 2b 49 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20  +IsStat34);.    
9eb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ec0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
9ed0: 64 78 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52  dxCur, addrNextR
9ee0: 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ow); VdbeCoverag
9ef0: 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  e(v);..    /* Ad
9f00: 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
9f10: 68 65 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20  he stat1 table. 
9f20: 2a 2f 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47  */.    callStatG
9f30: 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20  et(v, regStat4, 
9f40: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20  STAT_GET_STAT1, 
9f50: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 73  regStat1);.    s
9f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9f70: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f80: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33  d, regTabname, 3
9f90: 2c 20 72 65 67 54 65 6d 70 2c 20 22 61 61 61 22  , regTemp, "aaa"
9fa0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9fb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9fc0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
9fd0: 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  tCur, regNewRowi
9fe0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
9ff0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a000: 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72  Insert, iStatCur
a010: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
a020: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
a030: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
a040: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
a050: 44 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  D);..    /* Add 
a060: 74 68 65 20 65 6e 74 72 69 65 73 20 74 6f 20 74  the entries to t
a070: 68 65 20 73 74 61 74 33 20 6f 72 20 73 74 61 74  he stat3 or stat
a080: 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  4 table. */.#ifd
a090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a0a0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
a0b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
a0c0: 72 65 67 45 71 20 3d 20 72 65 67 53 74 61 74 31  regEq = regStat1
a0d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4c  ;.      int regL
a0e0: 74 20 3d 20 72 65 67 53 74 61 74 31 2b 31 3b 0a  t = regStat1+1;.
a0f0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 44 4c 74        int regDLt
a100: 20 3d 20 72 65 67 53 74 61 74 31 2b 32 3b 0a 20   = regStat1+2;. 
a110: 20 20 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70       int regSamp
a120: 6c 65 20 3d 20 72 65 67 53 74 61 74 31 2b 33 3b  le = regStat1+3;
a130: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 43 6f  .      int regCo
a140: 6c 20 3d 20 72 65 67 53 74 61 74 31 2b 34 3b 0a  l = regStat1+4;.
a150: 20 20 20 20 20 20 69 6e 74 20 72 65 67 53 61 6d        int regSam
a160: 70 6c 65 52 6f 77 69 64 20 3d 20 72 65 67 43 6f  pleRowid = regCo
a170: 6c 20 2b 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  l + nCol;.      
a180: 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20  int addrNext;.  
a190: 20 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75      int addrIsNu
a1a0: 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 73 65 65  ll;.      u8 see
a1b0: 6b 4f 70 20 3d 20 48 61 73 52 6f 77 69 64 28 70  kOp = HasRowid(p
a1c0: 54 61 62 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69  Tab) ? OP_NotExi
a1d0: 73 74 73 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e  sts : OP_NotFoun
a1e0: 64 3b 0a 0a 20 20 20 20 20 20 70 50 61 72 73 65  d;..      pParse
a1f0: 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61  ->nMem = MAX(pPa
a200: 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f  rse->nMem, regCo
a210: 6c 2b 6e 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20  l+nCol+1);..    
a220: 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
a230: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a240: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 61  ddr(v);.      ca
a250: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
a260: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
a270: 52 4f 57 49 44 2c 20 72 65 67 53 61 6d 70 6c 65  ROWID, regSample
a280: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64  Rowid);.      ad
a290: 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  drIsNull = sqlit
a2a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a2b0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 53 61  OP_IsNull, regSa
a2c0: 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20 20  mpleRowid);.    
a2d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a2e0: 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61  );.      callSta
a2f0: 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34  tGet(v, regStat4
a300: 2c 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 2c 20  , STAT_GET_NEQ, 
a310: 72 65 67 45 71 29 3b 0a 20 20 20 20 20 20 63 61  regEq);.      ca
a320: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
a330: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
a340: 4e 4c 54 2c 20 72 65 67 4c 74 29 3b 0a 20 20 20  NLT, regLt);.   
a350: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
a360: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
a370: 5f 47 45 54 5f 4e 44 4c 54 2c 20 72 65 67 44 4c  _GET_NDLT, regDL
a380: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a390: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a3a0: 2c 20 73 65 65 6b 4f 70 2c 20 69 54 61 62 43 75  , seekOp, iTabCu
a3b0: 72 2c 20 61 64 64 72 4e 65 78 74 2c 20 72 65 67  r, addrNext, reg
a3c0: 53 61 6d 70 6c 65 52 6f 77 69 64 2c 20 30 29 3b  SampleRowid, 0);
a3d0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 6b 6e 6f  .      /* We kno
a3e0: 77 20 74 68 61 74 20 74 68 65 20 72 65 67 53 61  w that the regSa
a3f0: 6d 70 6c 65 52 6f 77 69 64 20 72 6f 77 20 65 78  mpleRowid row ex
a400: 69 73 74 73 20 62 65 63 61 75 73 65 20 69 74 20  ists because it 
a410: 77 61 73 20 72 65 61 64 20 62 79 0a 20 20 20 20  was read by.    
a420: 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75    ** the previou
a430: 73 20 6c 6f 6f 70 2e 20 20 54 68 75 73 20 74 68  s loop.  Thus th
a440: 65 20 6e 6f 74 2d 66 6f 75 6e 64 20 6a 75 6d 70  e not-found jump
a450: 20 6f 66 20 73 65 65 6b 4f 70 20 77 69 6c 6c 20   of seekOp will 
a460: 6e 65 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 62  never.      ** b
a470: 65 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  e taken */.     
a480: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a490: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 23 69 66 64  erTaken(v);.#ifd
a4a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a4b0: 5f 53 54 41 54 33 0a 20 20 20 20 20 20 73 71 6c  _STAT3.      sql
a4c0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
a4d0: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
a4e0: 70 54 61 62 2c 20 69 54 61 62 43 75 72 2c 20 0a  pTab, iTabCur, .
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
a520: 6c 75 6d 6e 5b 30 5d 2c 20 72 65 67 53 61 6d 70  lumn[0], regSamp
a530: 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  le);.#else.     
a540: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
a550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a560: 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  i16 iCol = pIdx-
a570: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
a580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a590: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
a5a0: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
a5b0: 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
a5c0: 67 43 6f 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gCol+i);.      }
a5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a5e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
a5f0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 43 6f  akeRecord, regCo
a600: 6c 2c 20 6e 43 6f 6c 2b 31 2c 20 72 65 67 53 61  l, nCol+1, regSa
a610: 6d 70 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  mple);.#endif.  
a620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
a640: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
a650: 6d 65 2c 20 36 2c 20 72 65 67 54 65 6d 70 29 3b  me, 6, regTemp);
a660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a680: 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75  ewRowid, iStatCu
a690: 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  r+1, regNewRowid
a6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a6b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a6c0: 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75  _Insert, iStatCu
a6d0: 72 2b 31 2c 20 72 65 67 54 65 6d 70 2c 20 72 65  r+1, regTemp, re
a6e0: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
a6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a700: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
a710: 31 2c 20 61 64 64 72 4e 65 78 74 29 3b 20 2f 2a  1, addrNext); /*
a720: 20 50 31 3d 3d 31 20 66 6f 72 20 65 6e 64 2d 6f   P1==1 for end-o
a730: 66 2d 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  f-loop */.      
a740: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a750: 65 72 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c  ere(v, addrIsNul
a760: 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  l);.    }.#endif
a770: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a780: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a790: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20   */..    /* End 
a7a0: 6f 66 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20  of analysis */. 
a7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
a7c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 52 65  mpHere(v, addrRe
a7d0: 77 69 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  wind);.    sqlit
a7e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 47 6f  e3DbFree(db, aGo
a7f0: 74 6f 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 0a 20  toChng);.  }... 
a800: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 73 69 6e   /* Create a sin
a810: 67 6c 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  gle sqlite_stat1
a820: 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e   entry containin
a830: 67 20 4e 55 4c 4c 20 61 73 20 74 68 65 20 69 6e  g NULL as the in
a840: 64 65 78 0a 20 20 2a 2a 20 6e 61 6d 65 20 61 6e  dex.  ** name an
a850: 64 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20  d the row count 
a860: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  as the content..
a870: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 6e 6c 79    */.  if( pOnly
a880: 49 64 78 3d 3d 30 20 26 26 20 6e 65 65 64 54 61  Idx==0 && needTa
a890: 62 6c 65 43 6e 74 20 29 7b 0a 20 20 20 20 56 64  bleCnt ){.    Vd
a8a0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
a8b0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
a8c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a8d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
a8e0: 6f 75 6e 74 2c 20 69 54 61 62 43 75 72 2c 20 72  ount, iTabCur, r
a8f0: 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 6a 5a  egStat1);.    jZ
a900: 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74 65  eroRows = sqlite
a910: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
a920: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61 74  P_IfNot, regStat
a930: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
a940: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
a950: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a960: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78  _Null, 0, regIdx
a970: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
a980: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a990: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a9a0: 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65  egTabname, 3, re
a9b0: 67 54 65 6d 70 2c 20 22 61 61 61 22 2c 20 30 29  gTemp, "aaa", 0)
a9c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a9d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
a9e0: 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72  wRowid, iStatCur
a9f0: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
aa00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aa10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
aa20: 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  rt, iStatCur, re
aa30: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
aa40: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
aa50: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
aa60: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
aa70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
aa80: 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f  umpHere(v, jZero
aa90: 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Rows);.  }.}.../
aaa0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
aab0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  de that will cau
aac0: 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  se the most rece
aad0: 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79 73 69  nt index analysi
aae0: 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64 65  s to.** be loade
aaf0: 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20  d into internal 
ab00: 68 61 73 68 20 74 61 62 6c 65 73 20 77 68 65 72  hash tables wher
ab10: 65 20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  e is can be used
ab20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab30: 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 50 61   loadAnalysis(Pa
ab40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ab50: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
ab60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ab70: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ab80: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
ab90: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
aba0: 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c 20  P_LoadAnalysis, 
abb0: 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iDb);.  }.}../*.
abc0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
abd0: 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e   that will do an
abe0: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e 20   analysis of an 
abf0: 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 0a  entire database.
ac00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
ac10: 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 50  nalyzeDatabase(P
ac20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
ac30: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
ac40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ac50: 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  db;.  Schema *pS
ac60: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
ac70: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20 20  iDb].pSchema;   
ac80: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 64 61   /* Schema of da
ac90: 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20  tabase iDb */.  
aca0: 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20 69  HashElem *k;.  i
acb0: 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20 20 69  nt iStatCur;.  i
acc0: 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 69  nt iMem;.  int i
acd0: 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  Tab;..  sqlite3B
ace0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
acf0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
ad00: 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d  b);.  iStatCur =
ad10: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
ad20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
ad30: 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61   3;.  openStatTa
ad40: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
ad50: 20 69 53 74 61 74 43 75 72 2c 20 30 2c 20 30 29   iStatCur, 0, 0)
ad60: 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  iMem = pPars
ad70: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54 61  e->nMem+1;.  iTa
ad80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
ad90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ada0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
adb0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
adc0: 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65  ;.  for(k=sqlite
add0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
ade0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
adf0: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
ae00: 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(k)){.    Table
ae10: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a   *pTab = (Table*
ae20: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
ae30: 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f  k);.    analyzeO
ae40: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
ae50: 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74 43 75  pTab, 0, iStatCu
ae60: 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62 29 3b 0a  r, iMem, iTab);.
ae70: 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73    }.  loadAnalys
ae80: 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  is(pParse, iDb);
ae90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
aea0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
aeb0: 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  l do an analysis
aec0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62   of a single tab
aed0: 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74 61 62  le in.** a datab
aee0: 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79 49 64  ase.  If pOnlyId
aef0: 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  x is not NULL th
af00: 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e 67 6c  en it is a singl
af10: 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20 70 54  e index.** in pT
af20: 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ab that should b
af30: 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73  e analyzed..*/.s
af40: 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
af50: 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  zeTable(Parse *p
af60: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
af70: 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79  ab, Index *pOnly
af80: 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  Idx){.  int iDb;
af90: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b  .  int iStatCur;
afa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
afb0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
afc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
afd0: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61  dsAllMutexes(pPa
afe0: 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44  rse->db) );.  iD
aff0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
b000: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
b010: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
b020: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  ma);.  sqlite3Be
b030: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
b040: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
b050: 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20  );.  iStatCur = 
b060: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
b070: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20  pParse->nTab += 
b080: 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49 64  3;.  if( pOnlyId
b090: 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61  x ){.    openSta
b0a0: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  tTable(pParse, i
b0b0: 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 4f  Db, iStatCur, pO
b0c0: 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 22  nlyIdx->zName, "
b0d0: 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  idx");.  }else{.
b0e0: 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c      openStatTabl
b0f0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69  e(pParse, iDb, i
b100: 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d 3e 7a  StatCur, pTab->z
b110: 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a 20 20  Name, "tbl");.  
b120: 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61  }.  analyzeOneTa
b130: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
b140: 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53 74 61  , pOnlyIdx, iSta
b150: 74 43 75 72 2c 70 50 61 72 73 65 2d 3e 6e 4d 65  tCur,pParse->nMe
b160: 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e 54 61 62  m+1,pParse->nTab
b170: 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69  );.  loadAnalysi
b180: 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  s(pParse, iDb);.
b190: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
b1a0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 41  e code for the A
b1b0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20  NALYZE command. 
b1c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
b1d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  s this routine.*
b1e0: 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f 67 6e  * when it recogn
b1f0: 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20  izes an ANALYZE 
b200: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
b210: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 20        ANALYZE   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
b240: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
b250: 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20 20 20   <database>     
b260: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
b270: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
b280: 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  E  ?<database>.?
b290: 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
b2a0: 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  3.**.** Form 1 c
b2b0: 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
b2c0: 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
b2d0: 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
b2e0: 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46  e analyzed..** F
b2f0: 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20 61  orm 2 analyzes a
b300: 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65 20 73  ll indices the s
b310: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 6e  ingle database n
b320: 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20  amed..** Form 3 
b330: 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64  analyzes all ind
b340: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
b350: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
b360: 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
b370: 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50 61 72  lite3Analyze(Par
b380: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
b390: 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
b3a0: 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c   *pName2){.  sql
b3b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b3c0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
b3d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
b3e0: 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61  r *z, *zDb;.  Ta
b3f0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
b400: 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65  ex *pIdx;.  Toke
b410: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 0a  n *pTableName;..
b420: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
b430: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
b440: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b450: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
b460: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
b470: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
b480: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
b490: 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  L. */.  assert( 
b4a0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
b4b0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72  sAllMutexes(pPar
b4c0: 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28  se->db) );.  if(
b4d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
b4e0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
b4f0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
b500: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
b510: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c  rt( pName2!=0 ||
b520: 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20   pName1==0 );.  
b530: 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
b540: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20  .    /* Form 1: 
b550: 20 41 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68   Analyze everyth
b560: 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ing */.    for(i
b570: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
b590: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
b5a0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79   /* Do not analy
b5b0: 7a 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  ze the TEMP data
b5c0: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e  base */.      an
b5d0: 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50  alyzeDatabase(pP
b5e0: 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  arse, i);.    }.
b5f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
b600: 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->n==0 ){.    
b610: 2f 2a 20 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c  /* Form 2:  Anal
b620: 79 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  yze the database
b630: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20   or table named 
b640: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
b650: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
b660: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
b670: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb>=0 ){.      
b680: 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28  analyzeDatabase(
b690: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
b6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
b6b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b6c0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
b6d0: 65 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e1);.      if( z
b6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b6f0: 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46  (pIdx = sqlite3F
b700: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
b710: 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))!=0 ){.      
b720: 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65      analyzeTable
b730: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70  (pParse, pIdx->p
b740: 54 61 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20  Table, pIdx);.  
b750: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b760: 28 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c  (pTab = sqlite3L
b770: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
b780: 65 2c 20 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20  e, 0, z, 0))!=0 
b790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61  ){.          ana
b7a0: 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65  lyzeTable(pParse
b7b0: 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
b7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
b7d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b7e0: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
b7f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
b800: 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a  * Form 3: Analyz
b810: 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  e the fully qual
b820: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
b830: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
b840: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
b850: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
b860: 20 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65   pName2, &pTable
b870: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
b880: 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  Db>=0 ){.      z
b890: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
b8a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a  ].zName;.      z
b8b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b8c0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
b8d0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  leName);.      i
b8e0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
b8f0: 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69  if( (pIdx = sqli
b900: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
b910: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
b920: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
b930: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
b940: 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64  Idx->pTable, pId
b950: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
b960: 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71  e if( (pTab = sq
b970: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
b980: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a  (pParse, 0, z, z
b990: 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Db))!=0 ){.     
b9a0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
b9b0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
b9c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
b9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
b9e0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
b9f0: 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d    }.    }   .  }
ba00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74  .}../*.** Used t
ba10: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
ba20: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c  on from the anal
ba30: 79 7a 65 72 20 72 65 61 64 65 72 20 74 68 72 6f  yzer reader thro
ba40: 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  ugh to the.** ca
ba50: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a  llback routine..
ba60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
ba70: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61  t analysisInfo a
ba80: 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72  nalysisInfo;.str
ba90: 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  uct analysisInfo
baa0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
bab0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
bac0: 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f  zDatabase;.};../
bad0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
bae0: 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74  rgument points t
baf0: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
bb00: 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
bb10: 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20 6f  ning a.** list o
bb20: 66 20 73 70 61 63 65 20 73 65 70 61 72 61 74 65  f space separate
bb30: 64 20 69 6e 74 65 67 65 72 73 2e 20 52 65 61 64  d integers. Read
bb40: 20 74 68 65 20 66 69 72 73 74 20 6e 4f 75 74 20   the first nOut 
bb50: 6f 66 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a 2a  of these into.**
bb60: 20 74 68 65 20 61 72 72 61 79 20 61 4f 75 74 5b   the array aOut[
bb70: 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ]..*/.static voi
bb80: 64 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79  d decodeIntArray
bb90: 28 0a 20 20 63 68 61 72 20 2a 7a 49 6e 74 41 72  (.  char *zIntAr
bba0: 72 61 79 2c 20 20 20 20 20 20 20 2f 2a 20 53 74  ray,       /* St
bbb0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
bbc0: 69 6e 74 20 61 72 72 61 79 20 74 6f 20 64 65 63  int array to dec
bbd0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ode */.  int nOu
bbe0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
bbf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  /* Number of slo
bc00: 74 73 20 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f 0a  ts in aOut[] */.
bc10: 20 20 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74 2c    tRowcnt *aOut,
bc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
bc30: 65 20 69 6e 74 65 67 65 72 73 20 68 65 72 65 20  e integers here 
bc40: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 4c 6f  */.  LogEst *aLo
bc50: 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  g,          /* O
bc60: 72 2c 20 69 66 20 61 4f 75 74 3d 3d 30 2c 20 68  r, if aOut==0, h
bc70: 65 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ere */.  Index *
bc80: 70 49 6e 64 65 78 20 20 20 20 20 20 20 20 20 20  pIndex          
bc90: 2f 2a 20 48 61 6e 64 6c 65 20 65 78 74 72 61 20  /* Handle extra 
bca0: 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 69  flags for this i
bcb0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
bcc0: 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  L */.){.  char *
bcd0: 7a 20 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20  z = zIntArray;. 
bce0: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b   int c;.  int i;
bcf0: 0a 20 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 23  .  tRowcnt v;..#
bd00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd10: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
bd20: 54 34 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  T4.  if( z==0 ) 
bd30: 7a 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20  z = "";.#else.  
bd40: 69 66 28 20 4e 45 56 45 52 28 7a 3d 3d 30 29 20  if( NEVER(z==0) 
bd50: 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6e 64 69 66  ) z = "";.#endif
bd60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26  .  for(i=0; *z &
bd70: 26 20 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a  & i<nOut; i++){.
bd80: 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77      v = 0;.    w
bd90: 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d  hile( (c=z[0])>=
bda0: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b  '0' && c<='9' ){
bdb0: 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20  .      v = v*10 
bdc0: 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  + c - '0';.     
bdd0: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 64   z++;.    }.#ifd
bde0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bdf0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
be00: 20 20 20 20 69 66 28 20 61 4f 75 74 20 29 7b 0a      if( aOut ){.
be10: 20 20 20 20 20 20 61 4f 75 74 5b 69 5d 20 3d 20        aOut[i] = 
be20: 76 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6c  v;.    }else.#el
be30: 73 65 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  se.    assert( a
be40: 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 20 20 55 4e  Out==0 );.    UN
be50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
be60: 4f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Out);.#endif.   
be70: 20 7b 0a 20 20 20 20 20 20 61 4c 6f 67 5b 69 5d   {.      aLog[i]
be80: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
be90: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
bea0: 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b  f( *z==' ' ) z++
beb0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
bec0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
bed0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61 73 73  3_OR_STAT4.  ass
bee0: 65 72 74 28 20 70 49 6e 64 65 78 21 3d 30 20 29  ert( pIndex!=0 )
bef0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 49  ;.#else.  if( pI
bf00: 6e 64 65 78 20 29 0a 23 65 6e 64 69 66 0a 20 20  ndex ).#endif.  
bf10: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
bf20: 28 7a 2c 20 22 75 6e 6f 72 64 65 72 65 64 22 29  (z, "unordered")
bf30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
bf40: 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
bf50: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
bf60: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
bf70: 6f 62 28 22 73 7a 3d 5b 30 2d 39 5d 2a 22 2c 20  ob("sz=[0-9]*", 
bf80: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  z)==0 ){.      i
bf90: 6e 74 20 76 33 32 20 3d 20 30 3b 0a 20 20 20 20  nt v32 = 0;.    
bfa0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
bfb0: 32 28 7a 2b 33 2c 20 26 76 33 32 29 3b 0a 20 20  2(z+3, &v32);.  
bfc0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49 64      pIndex->szId
bfd0: 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  xRow = sqlite3Lo
bfe0: 67 45 73 74 28 76 33 32 29 3b 0a 20 20 20 20 7d  gEst(v32);.    }
bff0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
c000: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  is callback is i
c010: 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
c020: 65 61 63 68 20 69 6e 64 65 78 20 77 68 65 6e 20  each index when 
c030: 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73  reading the.** s
c040: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
c050: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61  e.  .**.**     a
c060: 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[0] = name of
c070: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
c080: 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65    argv[1] = name
c090: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 28 6d   of the index (m
c0a0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ight be NULL).**
c0b0: 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 72       argv[2] = r
c0c0: 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73  esults of analys
c0d0: 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20  is - on integer 
c0e0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
c0f0: 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f  **.** Entries fo
c100: 72 20 77 68 69 63 68 20 61 72 67 76 5b 31 5d 3d  r which argv[1]=
c110: 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63  =NULL simply rec
c120: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
c130: 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65  f rows in.** the
c140: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
c150: 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f  c int analysisLo
c160: 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  ader(void *pData
c170: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
c180: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
c190: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c  NotUsed){.  anal
c1a0: 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  ysisInfo *pInfo 
c1b0: 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a  = (analysisInfo*
c1c0: 29 70 44 61 74 61 3b 0a 20 20 49 6e 64 65 78 20  )pData;.  Index 
c1d0: 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65  *pIndex;.  Table
c1e0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *pTable;.  cons
c1f0: 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73  t char *z;..  as
c200: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
c210: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c220: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61 72  TER2(NotUsed, ar
c230: 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 76  gc);..  if( argv
c240: 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d  ==0 || argv[0]==
c250: 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20  0 || argv[2]==0 
c260: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c270: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
c280: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
c290: 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76  (pInfo->db, argv
c2a0: 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74  [0], pInfo->zDat
c2b0: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 54  abase);.  if( pT
c2c0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  able==0 ){.    r
c2d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
c2e0: 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b  f( argv[1]==0 ){
c2f0: 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
c300: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
c310: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 72 67  ite3_stricmp(arg
c320: 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d 30  v[0],argv[1])==0
c330: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d   ){.    pIndex =
c340: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
c350: 65 79 49 6e 64 65 78 28 70 54 61 62 6c 65 29 3b  eyIndex(pTable);
c360: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
c370: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
c380: 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64  ndIndex(pInfo->d
c390: 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66  b, argv[1], pInf
c3a0: 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  o->zDatabase);. 
c3b0: 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 32 5d   }.  z = argv[2]
c3c0: 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  ;..  if( pIndex 
c3d0: 29 7b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  ){.    decodeInt
c3e0: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
c3f0: 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  pIndex->nKeyCol+
c400: 31 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 61 69  1, 0, pIndex->ai
c410: 52 6f 77 4c 6f 67 45 73 74 2c 20 70 49 6e 64 65  RowLogEst, pInde
c420: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  x);.    if( pInd
c430: 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
c440: 65 3d 3d 30 20 29 20 70 54 61 62 6c 65 2d 3e 6e  e==0 ) pTable->n
c450: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 49 6e 64  RowLogEst = pInd
c460: 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  ex->aiRowLogEst[
c470: 30 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0];.  }else{.   
c480: 20 49 6e 64 65 78 20 66 61 6b 65 49 64 78 3b 0a   Index fakeIdx;.
c490: 20 20 20 20 66 61 6b 65 49 64 78 2e 73 7a 49 64      fakeIdx.szId
c4a0: 78 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 73  xRow = pTable->s
c4b0: 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 64 65 63  zTabRow;.    dec
c4c0: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
c4d0: 72 2a 29 7a 2c 20 31 2c 20 30 2c 20 26 70 54 61  r*)z, 1, 0, &pTa
c4e0: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c  ble->nRowLogEst,
c4f0: 20 26 66 61 6b 65 49 64 78 29 3b 0a 20 20 20 20   &fakeIdx);.    
c500: 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77  pTable->szTabRow
c510: 20 3d 20 66 61 6b 65 49 64 78 2e 73 7a 49 64 78   = fakeIdx.szIdx
c520: 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Row;.  }..  retu
c530: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
c540: 66 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d  f the Index.aSam
c550: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20  ple variable is 
c560: 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65  not NULL, delete
c570: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
c580: 72 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20  rray.** and its 
c590: 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  contents..*/.voi
c5a0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  d sqlite3DeleteI
c5b0: 6e 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69  ndexSamples(sqli
c5c0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
c5d0: 70 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pIdx){.#ifdef SQ
c5e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c5f0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
c600: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29   pIdx->aSample )
c610: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
c620: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
c630: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b  ->nSample; j++){
c640: 0a 20 20 20 20 20 20 49 6e 64 65 78 53 61 6d 70  .      IndexSamp
c650: 6c 65 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61  le *p = &pIdx->a
c660: 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20  Sample[j];.     
c670: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c680: 62 2c 20 70 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a  b, p->p);.    }.
c690: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c6a0: 65 28 64 62 2c 20 70 49 64 78 2d 3e 61 53 61 6d  e(db, pIdx->aSam
c6b0: 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ple);.  }.  if( 
c6c0: 64 62 20 26 26 20 64 62 2d 3e 70 6e 42 79 74 65  db && db->pnByte
c6d0: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
c6e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d   pIdx->nSample =
c6f0: 20 30 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53   0;.    pIdx->aS
c700: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23  ample = 0;.  }.#
c710: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
c720: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
c730: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
c740: 70 49 64 78 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  pIdx);.#endif /*
c750: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c760: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c770: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
c780: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c790: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f  R_STAT4./*.** Po
c7a0: 70 75 6c 61 74 65 20 74 68 65 20 70 49 64 78 2d  pulate the pIdx-
c7b0: 3e 61 41 76 67 45 71 5b 5d 20 61 72 72 61 79 20  >aAvgEq[] array 
c7c0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 61 6d  based on the sam
c7d0: 70 6c 65 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ples currently.*
c7e0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 49 64 78  * stored in pIdx
c7f0: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f  ->aSample[]. .*/
c800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
c810: 74 41 76 67 45 71 28 49 6e 64 65 78 20 2a 70 49  tAvgEq(Index *pI
c820: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
c830: 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70  ){.    IndexSamp
c840: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
c850: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20  dx->aSample;.   
c860: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 46   IndexSample *pF
c870: 69 6e 61 6c 20 3d 20 26 61 53 61 6d 70 6c 65 5b  inal = &aSample[
c880: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d  pIdx->nSample-1]
c890: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
c8a0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
c8b0: 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  iCol<pIdx->nKeyC
c8c0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
c8d0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c8f0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
c900: 74 68 72 6f 75 67 68 20 73 61 6d 70 6c 65 73 20  through samples 
c910: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
c920: 20 73 75 6d 45 71 20 3d 20 30 3b 20 20 20 20 20   sumEq = 0;     
c930: 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65     /* Sum of the
c940: 20 6e 45 71 20 76 61 6c 75 65 73 20 2a 2f 0a 20   nEq values */. 
c950: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 53 75       tRowcnt nSu
c960: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  m = 0;         /
c970: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
c980: 73 20 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 74  s contributing t
c990: 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20 20 20 20  o sumEq */.     
c9a0: 20 74 52 6f 77 63 6e 74 20 61 76 67 45 71 20 3d   tRowcnt avgEq =
c9b0: 20 30 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   0;.      tRowcn
c9c0: 74 20 6e 44 4c 74 20 3d 20 70 46 69 6e 61 6c 2d  t nDLt = pFinal-
c9d0: 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 0a 20  >anDLt[iCol];.. 
c9e0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d       /* Set nSum
c9f0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
ca00: 66 20 64 69 73 74 69 6e 63 74 20 28 69 43 6f 6c  f distinct (iCol
ca10: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
ca20: 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  es that.      **
ca30: 20 6f 63 63 75 72 20 69 6e 20 74 68 65 20 73 74   occur in the st
ca40: 61 74 34 20 74 61 62 6c 65 20 66 6f 72 20 74 68  at4 table for th
ca50: 69 73 20 69 6e 64 65 78 20 62 65 66 6f 72 65 20  is index before 
ca60: 70 46 69 6e 61 6c 2e 20 53 65 74 0a 20 20 20 20  pFinal. Set.    
ca70: 20 20 2a 2a 20 73 75 6d 45 71 20 74 6f 20 74 68    ** sumEq to th
ca80: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 45 71  e sum of the nEq
ca90: 20 76 61 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75   values for colu
caa0: 6d 6e 20 69 43 6f 6c 20 66 6f 72 20 74 68 65 20  mn iCol for the 
cab0: 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  same.      ** se
cac0: 74 20 28 61 64 64 69 6e 67 20 74 68 65 20 76 61  t (adding the va
cad0: 6c 75 65 20 6f 6e 6c 79 20 6f 6e 63 65 20 77 68  lue only once wh
cae0: 65 72 65 20 74 68 65 72 65 20 65 78 69 73 74 20  ere there exist 
caf0: 64 75 70 69 63 61 74 65 20 0a 20 20 20 20 20 20  dupicate .      
cb00: 2a 2a 20 70 72 65 66 69 78 65 73 29 2e 20 20 2a  ** prefixes).  *
cb10: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
cb20: 20 69 3c 28 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i<(pIdx->nSampl
cb30: 65 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e-1); i++){.    
cb40: 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
cb50: 69 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d  i].anDLt[iCol]!=
cb60: 61 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44  aSample[i+1].anD
cb70: 4c 74 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20  Lt[iCol] ){.    
cb80: 20 20 20 20 20 20 73 75 6d 45 71 20 2b 3d 20 61        sumEq += a
cb90: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
cba0: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Col];.          
cbb0: 6e 53 75 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSum++;.        
cbc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
cbd0: 69 66 28 20 6e 44 4c 74 3e 6e 53 75 6d 20 29 7b  if( nDLt>nSum ){
cbe0: 0a 20 20 20 20 20 20 20 20 61 76 67 45 71 20 3d  .        avgEq =
cbf0: 20 28 70 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69   (pFinal->anLt[i
cc00: 43 6f 6c 5d 20 2d 20 73 75 6d 45 71 29 2f 28 6e  Col] - sumEq)/(n
cc10: 44 4c 74 20 2d 20 6e 53 75 6d 29 3b 0a 20 20 20  DLt - nSum);.   
cc20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
cc30: 76 67 45 71 3d 3d 30 20 29 20 61 76 67 45 71 20  vgEq==0 ) avgEq 
cc40: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = 1;.      pIdx-
cc50: 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3d 20  >aAvgEq[iCol] = 
cc60: 61 76 67 45 71 3b 0a 20 20 20 20 20 20 69 66 28  avgEq;.      if(
cc70: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f   pIdx->nSampleCo
cc80: 6c 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==1 ) break;.  
cc90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
cca0: 20 4c 6f 6f 6b 20 75 70 20 61 6e 20 69 6e 64 65   Look up an inde
ccb0: 78 20 62 79 20 6e 61 6d 65 2e 20 20 4f 72 2c 20  x by name.  Or, 
ccc0: 69 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  if the name of a
ccd0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
cce0: 61 62 6c 65 0a 2a 2a 20 69 73 20 73 75 70 70 6c  able.** is suppl
ccf0: 69 65 64 20 69 6e 73 74 65 61 64 2c 20 66 69 6e  ied instead, fin
cd00: 64 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  d the PRIMARY KE
cd10: 59 20 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74  Y index for that
cd20: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
cd30: 63 20 49 6e 64 65 78 20 2a 66 69 6e 64 49 6e 64  c Index *findInd
cd40: 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 0a  exOrPrimaryKey(.
cd50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
cd60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cd70: 6d 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me,.  const char
cd80: 20 2a 7a 44 62 0a 29 7b 0a 20 20 49 6e 64 65 78   *zDb.){.  Index
cd90: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   *pIdx = sqlite3
cda0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
cdb0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  ame, zDb);.  if(
cdc0: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
cdd0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
cde0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
cdf0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
ce00: 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20      if( pTab && 
ce10: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
ce20: 29 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ) pIdx = sqlite3
ce30: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
ce40: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pTab);.  }.  ret
ce50: 75 72 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a  urn pIdx;.}../*.
ce60: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ** Load the cont
ce70: 65 6e 74 20 66 72 6f 6d 20 65 69 74 68 65 72 20  ent from either 
ce80: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
ce90: 20 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33   or sqlite_stat3
cea0: 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f 20   table .** into 
ceb0: 74 68 65 20 72 65 6c 65 76 61 6e 74 20 49 6e 64  the relevant Ind
cec0: 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  ex.aSample[] arr
ced0: 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ays..**.** Argum
cee0: 65 6e 74 73 20 7a 53 71 6c 31 20 61 6e 64 20 7a  ents zSql1 and z
cef0: 53 71 6c 32 20 6d 75 73 74 20 70 6f 69 6e 74 20  Sql2 must point 
cf00: 74 6f 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  to SQL statement
cf10: 73 20 74 68 61 74 20 72 65 74 75 72 6e 0a 2a 2a  s that return.**
cf20: 20 64 61 74 61 20 65 71 75 69 76 61 6c 65 6e 74   data equivalent
cf30: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
cf40: 67 20 28 73 74 61 74 65 6d 65 6e 74 73 20 61 72  g (statements ar
cf50: 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
cf60: 73 74 61 74 33 2c 0a 2a 2a 20 73 65 65 20 74 68  stat3,.** see th
cf70: 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  e caller of this
cf80: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65   function for de
cf90: 74 61 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20  tails):.**.**   
cfa0: 20 7a 53 71 6c 31 3a 20 53 45 4c 45 43 54 20 69   zSql1: SELECT i
cfb0: 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  dx,count(*) FROM
cfc0: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
cfd0: 20 47 52 4f 55 50 20 42 59 20 69 64 78 0a 2a 2a   GROUP BY idx.**
cfe0: 20 20 20 20 7a 53 71 6c 32 3a 20 53 45 4c 45 43      zSql2: SELEC
cff0: 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64  T idx,neq,nlt,nd
d000: 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25  lt,sample FROM %
d010: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a  Q.sqlite_stat4.*
d020: 2a 0a 2a 2a 20 77 68 65 72 65 20 25 51 20 69 73  *.** where %Q is
d030: 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 74   replaced with t
d040: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
d050: 20 62 65 66 6f 72 65 20 74 68 65 20 53 51 4c 20   before the SQL 
d060: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
d070: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53  static int loadS
d080: 74 61 74 54 62 6c 28 0a 20 20 73 71 6c 69 74 65  tatTbl(.  sqlite
d090: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d0a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
d0b0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d0c0: 69 6e 74 20 62 53 74 61 74 33 2c 20 20 20 20 20  int bStat3,     
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0e0: 20 41 73 73 75 6d 65 20 73 69 6e 67 6c 65 20 63   Assume single c
d0f0: 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 73 20 6f 6e  olumn records on
d100: 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ly */.  const ch
d110: 61 72 20 2a 7a 53 71 6c 31 2c 20 20 20 20 20 20  ar *zSql1,      
d120: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
d130: 74 65 6d 65 6e 74 20 31 20 28 73 65 65 20 61 62  tement 1 (see ab
d140: 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ove) */.  const 
d150: 63 68 61 72 20 2a 7a 53 71 6c 32 2c 20 20 20 20  char *zSql2,    
d160: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
d170: 74 61 74 65 6d 65 6e 74 20 32 20 28 73 65 65 20  tatement 2 (see 
d180: 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73  above) */.  cons
d190: 74 20 63 68 61 72 20 2a 7a 44 62 20 20 20 20 20  t char *zDb     
d1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
d1b0: 61 62 61 73 65 20 6e 61 6d 65 20 28 65 2e 67 2e  abase name (e.g.
d1c0: 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a 20   "main") */.){. 
d1d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1f0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66  * Result codes f
d200: 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
d210: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
d220: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
d230: 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
d240: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 75 6e  tement being run
d250: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   */.  char *zSql
d260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d270: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
d280: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
d290: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
d2a0: 65 76 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  evIdx = 0;      
d2b0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
d2c0: 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f  index in the loo
d2d0: 70 20 2a 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70  p */.  IndexSamp
d2e0: 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20  le *pSample;    
d2f0: 20 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69       /* A slot i
d300: 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b  n pIdx->aSample[
d310: 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
d320: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
d330: 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 7a  nabled==0 );.  z
d340: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
d350: 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31 2c 20  intf(db, zSql1, 
d360: 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53 71  zDb);.  if( !zSq
d370: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
d380: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d390: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
d3a0: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
d3b0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
d3c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d3d0: 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
d3e0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d3f0: 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71  rc;..  while( sq
d400: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
d410: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
d420: 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 43 6f 6c  .    int nIdxCol
d430: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
d440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d450: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 74 61 74 34  columns in stat4
d460: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   records */.    
d470: 69 6e 74 20 6e 41 76 67 43 6f 6c 20 3d 20 31 3b  int nAvgCol = 1;
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d490: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
d4a0: 65 73 20 69 6e 20 49 6e 64 65 78 2e 61 41 76 67  es in Index.aAvg
d4b0: 45 71 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20  Eq */..    char 
d4c0: 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e  *zIndex;   /* In
d4d0: 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  dex name */.    
d4e0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
d4f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
d500: 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e index object *
d510: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c  /.    int nSampl
d520: 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  e;    /* Number 
d530: 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20  of samples */.  
d540: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
d550: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
d560: 61 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ace required */.
d570: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
d580: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
d590: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a  space required *
d5a0: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 70  /.    tRowcnt *p
d5b0: 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49 6e 64  Space;..    zInd
d5c0: 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ex = (char *)sql
d5d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
d5e0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
d5f0: 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20  if( zIndex==0 ) 
d600: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53  continue;.    nS
d610: 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  ample = sqlite3_
d620: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
d630: 2c 20 31 29 3b 0a 20 20 20 20 70 49 64 78 20 3d  , 1);.    pIdx =
d640: 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d   findIndexOrPrim
d650: 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65  aryKey(db, zInde
d660: 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 61 73 73  x, zDb);.    ass
d670: 65 72 74 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20  ert( pIdx==0 || 
d680: 62 53 74 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e  bStat3 || pIdx->
d690: 6e 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20  nSample==0 );.  
d6a0: 20 20 2f 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70    /* Index.nSamp
d6b0: 6c 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  le is non-zero a
d6c0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20  t this point if 
d6d0: 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79  data has already
d6e0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61   been.    ** loa
d6f0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ded from the sta
d700: 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69  t4 table. In thi
d710: 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74  s case ignore st
d720: 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  at3 data.  */.  
d730: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c    if( pIdx==0 ||
d740: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29   pIdx->nSample )
d750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
d760: 66 28 20 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a  f( bStat3==0 ){.
d770: 20 20 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20        nIdxCol = 
d780: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b  pIdx->nKeyCol+1;
d790: 0a 20 20 20 20 20 20 6e 41 76 67 43 6f 6c 20 3d  .      nAvgCol =
d7a0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
d7b0: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e      }.    pIdx->
d7c0: 6e 53 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64  nSampleCol = nId
d7d0: 78 43 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20  xCol;.    nByte 
d7e0: 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61  = sizeof(IndexSa
d7f0: 6d 70 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b  mple) * nSample;
d800: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69  .    nByte += si
d810: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20  zeof(tRowcnt) * 
d820: 6e 49 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53  nIdxCol * 3 * nS
d830: 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65  ample;.    nByte
d840: 20 2b 3d 20 6e 41 76 67 43 6f 6c 20 2a 20 73 69   += nAvgCol * si
d850: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20 20  zeof(tRowcnt);  
d860: 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
d870: 49 6e 64 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a  Index.aAvgEq[] *
d880: 2f 0a 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61  /..    pIdx->aSa
d890: 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mple = sqlite3Db
d8a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
d8b0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
d8c0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20  Idx->aSample==0 
d8d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d8e0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
d8f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
d900: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
d910: 20 7d 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20   }.    pSpace = 
d920: 28 74 52 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d  (tRowcnt*)&pIdx-
d930: 3e 61 53 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65  >aSample[nSample
d940: 5d 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 41 76  ];.    pIdx->aAv
d950: 67 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53  gEq = pSpace; pS
d960: 70 61 63 65 20 2b 3d 20 6e 41 76 67 43 6f 6c 3b  pace += nAvgCol;
d970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d980: 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
d990: 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70       pIdx->aSamp
d9a0: 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70  le[i].anEq = pSp
d9b0: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e  ace; pSpace += n
d9c0: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49  IdxCol;.      pI
d9d0: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  dx->aSample[i].a
d9e0: 6e 4c 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53  nLt = pSpace; pS
d9f0: 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b  pace += nIdxCol;
da00: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61  .      pIdx->aSa
da10: 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20  mple[i].anDLt = 
da20: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
da30: 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d  = nIdxCol;.    }
da40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 75  .    assert( ((u
da50: 38 2a 29 70 53 70 61 63 65 29 2d 6e 42 79 74 65  8*)pSpace)-nByte
da60: 3d 3d 28 75 38 2a 29 28 70 49 64 78 2d 3e 61 53  ==(u8*)(pIdx->aS
da70: 61 6d 70 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20  ample) );.  }.  
da80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
da90: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
daa0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
dab0: 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71  rc;..  zSql = sq
dac0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
dad0: 20 7a 53 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20   zSql2, zDb);.  
dae0: 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
daf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
db00: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
db10: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
db20: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
db30: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
db40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
db50: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
db60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77   return rc;..  w
db70: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
db80: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
db90: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61  E_ROW ){.    cha
dba0: 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 20 20 20  r *zIndex;      
dbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dbc0: 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  dex name */.    
dbd0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbf0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
dc00: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
dc10: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31      int nCol = 1
dc20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dc40: 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20  olumns in index 
dc50: 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d  */..    zIndex =
dc60: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
dc70: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
dc80: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
dc90: 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74  zIndex==0 ) cont
dca0: 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 20 3d  inue;.    pIdx =
dcb0: 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d   findIndexOrPrim
dcc0: 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65  aryKey(db, zInde
dcd0: 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  x, zDb);.    if(
dce0: 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69   pIdx==0 ) conti
dcf0: 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73  nue;.    /* This
dd00: 20 6e 65 78 74 20 63 6f 6e 64 69 74 69 6f 6e 20   next condition 
dd10: 69 73 20 74 72 75 65 20 69 66 20 64 61 74 61 20  is true if data 
dd20: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
dd30: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 0a 20 20   loaded from .  
dd40: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
dd50: 73 74 61 74 34 20 74 61 62 6c 65 2e 20 49 6e 20  stat4 table. In 
dd60: 74 68 69 73 20 63 61 73 65 20 69 67 6e 6f 72 65  this case ignore
dd70: 20 73 74 61 74 33 20 64 61 74 61 2e 20 20 2a 2f   stat3 data.  */
dd80: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78  .    nCol = pIdx
dd90: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3b 0a 20 20  ->nSampleCol;.  
dda0: 20 20 69 66 28 20 62 53 74 61 74 33 20 26 26 20    if( bStat3 && 
ddb0: 6e 43 6f 6c 3e 31 20 29 20 63 6f 6e 74 69 6e 75  nCol>1 ) continu
ddc0: 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 21  e;.    if( pIdx!
ddd0: 3d 70 50 72 65 76 49 64 78 20 29 7b 0a 20 20 20  =pPrevIdx ){.   
dde0: 20 20 20 69 6e 69 74 41 76 67 45 71 28 70 50 72     initAvgEq(pPr
ddf0: 65 76 49 64 78 29 3b 0a 20 20 20 20 20 20 70 50  evIdx);.      pP
de00: 72 65 76 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  revIdx = pIdx;. 
de10: 20 20 20 7d 0a 20 20 20 20 70 53 61 6d 70 6c 65     }.    pSample
de20: 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c   = &pIdx->aSampl
de30: 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 5d  e[pIdx->nSample]
de40: 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  ;.    decodeIntA
de50: 72 72 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69  rray((char*)sqli
de60: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
de70: 70 53 74 6d 74 2c 31 29 2c 6e 43 6f 6c 2c 70 53  pStmt,1),nCol,pS
de80: 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c 30 2c 30 29  ample->anEq,0,0)
de90: 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  ;.    decodeIntA
dea0: 72 72 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69  rray((char*)sqli
deb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
dec0: 70 53 74 6d 74 2c 32 29 2c 6e 43 6f 6c 2c 70 53  pStmt,2),nCol,pS
ded0: 61 6d 70 6c 65 2d 3e 61 6e 4c 74 2c 30 2c 30 29  ample->anLt,0,0)
dee0: 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  ;.    decodeIntA
def0: 72 72 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69  rray((char*)sqli
df00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
df10: 70 53 74 6d 74 2c 33 29 2c 6e 43 6f 6c 2c 70 53  pStmt,3),nCol,pS
df20: 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30 2c 30  ample->anDLt,0,0
df30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20  );..    /* Take 
df40: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 61  a copy of the sa
df50: 6d 70 6c 65 2e 20 41 64 64 20 74 77 6f 20 30 78  mple. Add two 0x
df60: 30 30 20 62 79 74 65 73 20 74 68 65 20 65 6e 64  00 bytes the end
df70: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 0a   of the buffer..
df80: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69      ** This is i
df90: 6e 20 63 61 73 65 20 74 68 65 20 73 61 6d 70 6c  n case the sampl
dfa0: 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
dfb0: 75 70 74 65 64 2e 20 49 6e 20 74 68 61 74 20 63  upted. In that c
dfc0: 61 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ase, the.    ** 
dfd0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
dfe0: 64 43 6f 6d 70 61 72 65 28 29 20 6d 61 79 20 72  dCompare() may r
dff0: 65 61 64 20 75 70 20 74 6f 20 74 77 6f 20 76 61  ead up to two va
e000: 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 0a 20  rints past the. 
e010: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
e020: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
e030: 72 20 62 65 66 6f 72 65 20 69 74 20 72 65 61 6c  r before it real
e040: 69 7a 65 73 20 69 74 20 69 73 20 64 65 61 6c 69  izes it is deali
e050: 6e 67 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  ng with.    ** a
e060: 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64 2e   corrupt record.
e070: 20 41 64 64 69 6e 67 20 74 68 65 20 74 77 6f 20   Adding the two 
e080: 30 78 30 30 20 62 79 74 65 73 20 70 72 65 76 65  0x00 bytes preve
e090: 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 20 63 61  nts this from ca
e0a0: 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 62  using.    ** a b
e0b0: 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
e0c0: 20 2a 2f 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d   */.    pSample-
e0d0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  >n = sqlite3_col
e0e0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
e0f0: 20 34 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65   4);.    pSample
e100: 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->p = sqlite3DbM
e110: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 70 53  allocZero(db, pS
e120: 61 6d 70 6c 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20  ample->n + 2);. 
e130: 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e     if( pSample->
e140: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
e150: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e160: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
e170: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
e190: 70 79 28 70 53 61 6d 70 6c 65 2d 3e 70 2c 20 73  py(pSample->p, s
e1a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
e1b0: 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 70 53  ob(pStmt, 4), pS
e1c0: 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20 20 20 70  ample->n);.    p
e1d0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a  Idx->nSample++;.
e1e0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e1f0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
e200: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
e210: 4c 49 54 45 5f 4f 4b 20 29 20 69 6e 69 74 41 76  LITE_OK ) initAv
e220: 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20  gEq(pPrevIdx);. 
e230: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e240: 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e  *.** Load conten
e250: 74 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  t from the sqlit
e260: 65 5f 73 74 61 74 34 20 61 6e 64 20 73 71 6c 69  e_stat4 and sqli
e270: 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20  te_stat3 tables 
e280: 69 6e 74 6f 20 0a 2a 2a 20 74 68 65 20 49 6e 64  into .** the Ind
e290: 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  ex.aSample[] arr
e2a0: 61 79 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63  ays of all indic
e2b0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
e2c0: 74 20 6c 6f 61 64 53 74 61 74 34 28 73 71 6c 69  t loadStat4(sqli
e2d0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
e2e0: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74  har *zDb){.  int
e2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e310: 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f  Result codes fro
e320: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
e330: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
e340: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
e350: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ed==0 );.  if( s
e360: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
e370: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
e380: 34 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  4", zDb) ){.    
e390: 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c  rc = loadStatTbl
e3a0: 28 64 62 2c 20 30 2c 0a 20 20 20 20 20 20 22 53  (db, 0,.      "S
e3b0: 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28  ELECT idx,count(
e3c0: 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  *) FROM %Q.sqlit
e3d0: 65 5f 73 74 61 74 34 20 47 52 4f 55 50 20 42 59  e_stat4 GROUP BY
e3e0: 20 69 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53   idx", .      "S
e3f0: 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c  ELECT idx,neq,nl
e400: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52  t,ndlt,sample FR
e410: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
e420: 74 34 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20  t4",.      zDb. 
e430: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
e440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e450: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  & sqlite3FindTab
e460: 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
e470: 74 61 74 33 22 2c 20 7a 44 62 29 20 29 7b 0a 20  tat3", zDb) ){. 
e480: 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74     rc = loadStat
e490: 54 62 6c 28 64 62 2c 20 31 2c 0a 20 20 20 20 20  Tbl(db, 1,.     
e4a0: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75   "SELECT idx,cou
e4b0: 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71  nt(*) FROM %Q.sq
e4c0: 6c 69 74 65 5f 73 74 61 74 33 20 47 52 4f 55 50  lite_stat3 GROUP
e4d0: 20 42 59 20 69 64 78 22 2c 20 0a 20 20 20 20 20   BY idx", .     
e4e0: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71   "SELECT idx,neq
e4f0: 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 71 6c 69 74 65  ,nlt,ndlt,sqlite
e500: 5f 72 65 63 6f 72 64 28 73 61 6d 70 6c 65 29 20  _record(sample) 
e510: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
e520: 74 61 74 33 22 2c 0a 20 20 20 20 20 20 7a 44 62  tat3",.      zDb
e530: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  .    );.  }..  r
e540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e550: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
e560: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
e570: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  T4 */../*.** Loa
e580: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
e590: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
e5a0: 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
e5b0: 74 33 2f 34 20 74 61 62 6c 65 73 2e 20 54 68 65  t3/4 tables. The
e5c0: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
e5d0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 72 65  sqlite_stat1 are
e5e0: 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74   used to populat
e5f0: 65 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  e the Index.aiRo
e600: 77 45 73 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73  wEst[].** arrays
e610: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
e620: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34  f sqlite_stat3/4
e630: 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70   are used to pop
e640: 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64  ulate the.** Ind
e650: 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  ex.aSample[] arr
e660: 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ays..**.** If th
e670: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
e680: 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73  able is not pres
e690: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
e6a0: 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  ase, SQLITE_ERRO
e6b0: 52 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  R.** is returned
e6c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
e6d0: 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  even if SQLITE_E
e6e0: 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61  NABLE_STAT3/4 wa
e6f0: 73 20 64 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75  s defined .** du
e700: 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  ring compilation
e710: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
e720: 73 74 61 74 33 2f 34 20 74 61 62 6c 65 20 69 73  stat3/4 table is
e730: 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20 64 61 74   present, no dat
e740: 61 20 69 73 20 0a 2a 2a 20 72 65 61 64 20 66 72  a is .** read fr
e750: 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  om it..**.** If 
e760: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e770: 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65  AT3/4 was define
e780: 64 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61  d during compila
e790: 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 0a 2a 2a  tion and the .**
e7a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
e7b0: 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ble is not prese
e7c0: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
e7d0: 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  se, SQLITE_ERROR
e7e0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
e7f0: 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 74 68 69   However, in thi
e800: 73 20 63 61 73 65 2c 20 64 61 74 61 20 69 73 20  s case, data is 
e810: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 71  read from the sq
e820: 6c 69 74 65 5f 73 74 61 74 31 0a 2a 2a 20 74 61  lite_stat1.** ta
e830: 62 6c 65 20 28 69 66 20 69 74 20 69 73 20 70 72  ble (if it is pr
e840: 65 73 65 6e 74 29 20 62 65 66 6f 72 65 20 72 65  esent) before re
e850: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
e860: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
e870: 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63  ccurs, this func
e880: 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 65 74 73  tion always sets
e890: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e8a0: 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  d..** This means
e8b0: 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
e8c0: 6f 65 73 20 6e 6f 74 20 63 61 72 65 20 61 62 6f  oes not care abo
e8d0: 75 74 20 6f 74 68 65 72 20 65 72 72 6f 72 73 2c  ut other errors,
e8e0: 20 74 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 63   the return.** c
e8f0: 6f 64 65 20 6d 61 79 20 62 65 20 69 67 6e 6f 72  ode may be ignor
e900: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e910: 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73  e3AnalysisLoad(s
e920: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e930: 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73  iDb){.  analysis
e940: 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61  Info sInfo;.  Ha
e950: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61  shElem *i;.  cha
e960: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
e970: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  c;..  assert( iD
e980: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
e990: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
e9a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
e9b0: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c  t!=0 );..  /* Cl
e9c0: 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74  ear any prior st
e9d0: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73  atistics */.  as
e9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
e9f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
ea00: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f   iDb, 0) );.  fo
ea10: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
ea20: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
ea30: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
ea40: 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61  sh);i;i=sqliteHa
ea50: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
ea60: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
ea70: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
ea80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 66 61  .    sqlite3Defa
ea90: 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29 3b  ultRowEst(pIdx);
eaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
eab0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
eac0: 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
ead0: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
eae0: 65 73 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20  es(db, pIdx);.  
eaf0: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20    pIdx->aSample 
eb00: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
eb10: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
eb20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 71 6c  ake sure the sql
eb30: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
eb40: 65 78 69 73 74 73 20 2a 2f 0a 20 20 73 49 6e 66  exists */.  sInf
eb50: 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e  o.db = db;.  sIn
eb60: 66 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64  fo.zDatabase = d
eb70: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
eb80: 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
eb90: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73  FindTable(db, "s
eba0: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49  qlite_stat1", sI
ebb0: 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3d 3d  nfo.zDatabase)==
ebc0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ebd0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ebe0: 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65 77  }..  /* Load new
ebf0: 20 73 74 61 74 69 73 74 69 63 73 20 6f 75 74 20   statistics out 
ec00: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
ec10: 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7a  at1 table */.  z
ec20: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
ec30: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
ec40: 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c  "SELECT tbl,idx,
ec50: 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c  stat FROM %Q.sql
ec60: 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66  ite_stat1", sInf
ec70: 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
ec80: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
ec90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
eca0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
ecb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ecc0: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61  exec(db, zSql, a
ecd0: 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26  nalysisLoader, &
ece0: 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 73  sInfo, 0);.    s
ecf0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ed00: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20   zSql);.  }...  
ed10: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74  /* Load the stat
ed20: 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20  istics from the 
ed30: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62  sqlite_stat4 tab
ed40: 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  le. */.#ifdef SQ
ed50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ed60: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
ed70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ed80: 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 73  {.    int lookas
ed90: 69 64 65 45 6e 61 62 6c 65 64 20 3d 20 64 62 2d  ideEnabled = db-
eda0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
edb0: 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  led;.    db->loo
edc0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
edd0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  = 0;.    rc = lo
ede0: 61 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66  adStat4(db, sInf
edf0: 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
ee00: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
ee10: 62 45 6e 61 62 6c 65 64 20 3d 20 6c 6f 6f 6b 61  bEnabled = looka
ee20: 73 69 64 65 45 6e 61 62 6c 65 64 3b 0a 20 20 7d  sideEnabled;.  }
ee30: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
ee40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
ee50: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
ee60: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
ee70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ee80: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
ee90: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20  TE_OMIT_ANALYZE 
eea0: 2a 2f 0a                                         */.