/ Hex Artifact Content
Login

Artifact 581d5c18ce89c6f45d4dca65914d0de5b4dad41f:


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 73 71 6c 69 74  xCur);.    sqlit
9570: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9580: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
9590: 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 61 64 64  egChng);.    add
95a0: 72 47 6f 74 6f 43 68 6e 67 30 20 3d 20 73 71 6c  rGotoChng0 = sql
95b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
95c0: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20  , OP_Goto);..   
95d0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74   /*.    **  next
95e0: 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72  _row:.    **   r
95f0: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a  egChng = 0.    *
9600: 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20 21  *   if( idx(0) !
9610: 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20 67  = regPrev(0) ) g
9620: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a  oto chng_addr_0.
9630: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9640: 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 1.    **   if
9650: 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67 50  ( idx(1) != regP
9660: 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68  rev(1) ) goto ch
9670: 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a  ng_addr_1.    **
9680: 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20     ....    **   
9690: 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20  regChng = N.    
96a0: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
96b0: 64 64 72 5f 4e 0a 20 20 20 20 2a 2f 0a 20 20 20  ddr_N.    */.   
96c0: 20 61 64 64 72 4e 65 78 74 52 6f 77 20 3d 20 73   addrNextRow = s
96d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
96e0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 66 6f  tAddr(v);.    fo
96f0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
9700: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
9710: 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29  *pColl = (char*)
9720: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9730: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64  lSeq(pParse, pId
9740: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  x->azColl[i]);. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9760: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9770: 65 67 65 72 2c 20 69 2c 20 72 65 67 43 68 6e 67  eger, i, regChng
9780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9790: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
97a0: 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
97b0: 2c 20 69 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20  , i, regTemp);. 
97c0: 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69       aGotoChng[i
97d0: 5d 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69 74  ] = .      sqlit
97e0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
97f0: 4f 50 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20  OP_Ne, regTemp, 
9800: 30 2c 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43  0, regPrev+i, pC
9810: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
9820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9830: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
9840: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
9850: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9860: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9870: 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 2c 20  _Integer, nCol, 
9880: 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 61 47  regChng);.    aG
9890: 6f 74 6f 43 68 6e 67 5b 6e 43 6f 6c 5d 20 3d 20  otoChng[nCol] = 
98a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
98b0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a  0(v, OP_Goto);..
98c0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63      /*.    **  c
98d0: 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20  hng_addr_0:.    
98e0: 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30 29 20  **   regPrev(0) 
98f0: 3d 20 69 64 78 28 30 29 0a 20 20 20 20 2a 2a 20  = idx(0).    ** 
9900: 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20   chng_addr_1:.  
9910: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31    **   regPrev(1
9920: 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20 2a  ) = idx(1).    *
9930: 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20  *  ....    */.  
9940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
9950: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
9960: 6f 43 68 6e 67 30 29 3b 0a 20 20 20 20 66 6f 72  oChng0);.    for
9970: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
9980: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9990: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
99a0: 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a   aGotoChng[i]);.
99b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
99c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
99d0: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69  lumn, iIdxCur, i
99e0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
99f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
9a00: 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 4e 3a  **  chng_addr_N:
9a10: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77  .    **   regRow
9a20: 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 20  id = idx(rowid) 
9a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53 54             // ST
9a40: 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  AT34 only.    **
9a50: 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20     stat_push(P, 
9a60: 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69  regChng, regRowi
9a70: 64 29 20 20 2f 2f 20 33 72 64 20 70 61 72 61 6d  d)  // 3rd param
9a80: 65 74 65 72 20 53 54 41 54 33 34 20 6f 6e 6c 79  eter STAT34 only
9a90: 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63  .    **   Next c
9aa0: 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21  sr.    **   if !
9ab0: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65  eof(csr) goto ne
9ac0: 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a 20  xt_row;.    */. 
9ad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
9ae0: 6d 70 48 65 72 65 28 76 2c 20 61 47 6f 74 6f 43  mpHere(v, aGotoC
9af0: 68 6e 67 5b 6e 43 6f 6c 5d 29 3b 0a 23 69 66 64  hng[nCol]);.#ifd
9b00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9b10: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
9b20: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
9b30: 6f 77 69 64 3d 3d 28 72 65 67 53 74 61 74 34 2b  owid==(regStat4+
9b40: 32 29 20 29 3b 0a 20 20 20 20 69 66 28 20 48 61  2) );.    if( Ha
9b50: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
9b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
9b80: 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
9b90: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
9ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
9bb0: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
9bc0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
9bd0: 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a  (pIdx->pTable);.
9be0: 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6b 2c 20        int j, k, 
9bf0: 72 65 67 4b 65 79 3b 0a 20 20 20 20 20 20 72 65  regKey;.      re
9c00: 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  gKey = sqlite3Ge
9c10: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
9c20: 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
9c30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
9c40: 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
9c50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
9c60: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
9c70: 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
9c80: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
9c90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9ca0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9cb0: 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
9cc0: 2c 20 6b 2c 20 72 65 67 4b 65 79 2b 6a 29 3b 0a  , k, regKey+j);.
9cd0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
9ce0: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
9cf0: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
9d00: 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
9d10: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
9d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9d30: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9d40: 63 6f 72 64 2c 20 72 65 67 4b 65 79 2c 20 70 50  cord, regKey, pP
9d50: 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 52  k->nKeyCol, regR
9d60: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
9d70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9d80: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
9d90: 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Key, pPk->nKeyCo
9da0: 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  l);.    }.#endif
9db0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67  .    assert( reg
9dc0: 43 68 6e 67 3d 3d 28 72 65 67 53 74 61 74 34 2b  Chng==(regStat4+
9dd0: 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  1) );.    sqlite
9de0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9df0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c 20 72  P_Function, 1, r
9e00: 65 67 53 74 61 74 34 2c 20 72 65 67 54 65 6d 70  egStat4, regTemp
9e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9e20: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9e30: 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 50 75  , (char*)&statPu
9e40: 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55  shFuncdef, P4_FU
9e50: 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
9e60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9e70: 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29 3b 0a  v, 2+IsStat34);.
9e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9e90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
9ea0: 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
9eb0: 65 78 74 52 6f 77 29 3b 0a 0a 20 20 20 20 2f 2a  extRow);..    /*
9ec0: 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
9ed0: 6f 20 74 68 65 20 73 74 61 74 31 20 74 61 62 6c  o the stat1 tabl
9ee0: 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 53 74  e. */.    callSt
9ef0: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
9f00: 34 2c 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  4, STAT_GET_STAT
9f10: 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20  1, regStat1);.  
9f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f30: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
9f40: 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65  cord, regTabname
9f50: 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20 22 61  , 3, regTemp, "a
9f60: 61 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  aa", 0);.    sql
9f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9f80: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
9f90: 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65 77 52  StatCur, regNewR
9fa0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9fb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9fc0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74  OP_Insert, iStat
9fd0: 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20 72 65  Cur, regTemp, re
9fe0: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
9ff0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a000: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
a010: 50 45 4e 44 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  PEND);..    /* A
a020: 64 64 20 74 68 65 20 65 6e 74 72 69 65 73 20 74  dd the entries t
a030: 6f 20 74 68 65 20 73 74 61 74 33 20 6f 72 20 73  o the stat3 or s
a040: 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23  tat4 table. */.#
a050: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a060: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a070: 54 34 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  T4.    {.      i
a080: 6e 74 20 72 65 67 45 71 20 3d 20 72 65 67 53 74  nt regEq = regSt
a090: 61 74 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  at1;.      int r
a0a0: 65 67 4c 74 20 3d 20 72 65 67 53 74 61 74 31 2b  egLt = regStat1+
a0b0: 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  1;.      int reg
a0c0: 44 4c 74 20 3d 20 72 65 67 53 74 61 74 31 2b 32  DLt = regStat1+2
a0d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 53  ;.      int regS
a0e0: 61 6d 70 6c 65 20 3d 20 72 65 67 53 74 61 74 31  ample = regStat1
a0f0: 2b 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  +3;.      int re
a100: 67 43 6f 6c 20 3d 20 72 65 67 53 74 61 74 31 2b  gCol = regStat1+
a110: 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  4;.      int reg
a120: 53 61 6d 70 6c 65 52 6f 77 69 64 20 3d 20 72 65  SampleRowid = re
a130: 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b 0a 20 20 20  gCol + nCol;.   
a140: 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b     int addrNext;
a150: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
a160: 73 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  sNull;.      u8 
a170: 73 65 65 6b 4f 70 20 3d 20 48 61 73 52 6f 77 69  seekOp = HasRowi
a180: 64 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e 6f 74  d(pTab) ? OP_Not
a190: 45 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f 74 46  Exists : OP_NotF
a1a0: 6f 75 6e 64 3b 0a 0a 20 20 20 20 20 20 70 50 61  ound;..      pPa
a1b0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28  rse->nMem = MAX(
a1c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65  pParse->nMem, re
a1d0: 67 43 6f 6c 2b 6e 43 6f 6c 2b 31 29 3b 0a 0a 20  gCol+nCol+1);.. 
a1e0: 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
a1f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a200: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
a210: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20   callStatGet(v, 
a220: 72 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47  regStat4, STAT_G
a230: 45 54 5f 52 4f 57 49 44 2c 20 72 65 67 53 61 6d  ET_ROWID, regSam
a240: 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  pleRowid);.     
a250: 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71   addrIsNull = sq
a260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a270: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
a280: 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20  gSampleRowid);. 
a290: 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74       callStatGet
a2a0: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
a2b0: 41 54 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67 45  AT_GET_NEQ, regE
a2c0: 71 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74  q);.      callSt
a2d0: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
a2e0: 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 2c  4, STAT_GET_NLT,
a2f0: 20 72 65 67 4c 74 29 3b 0a 20 20 20 20 20 20 63   regLt);.      c
a300: 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65  allStatGet(v, re
a310: 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54  gStat4, STAT_GET
a320: 5f 4e 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b 0a  _NDLT, regDLt);.
a330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a340: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 73 65  eAddOp4Int(v, se
a350: 65 6b 4f 70 2c 20 69 54 61 62 43 75 72 2c 20 61  ekOp, iTabCur, a
a360: 64 64 72 4e 65 78 74 2c 20 72 65 67 53 61 6d 70  ddrNext, regSamp
a370: 6c 65 52 6f 77 69 64 2c 20 30 29 3b 0a 23 69 66  leRowid, 0);.#if
a380: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a390: 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20 73 71  E_STAT3.      sq
a3a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
a3b0: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
a3c0: 20 70 54 61 62 2c 20 69 54 61 62 43 75 72 2c 20   pTab, iTabCur, 
a3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
a400: 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65 67 53 61 6d  olumn[0], regSam
a410: 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ple);.#else.    
a420: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a430: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a440: 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78   i16 iCol = pIdx
a450: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
a460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a470: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
a480: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
a490: 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72  iTabCur, iCol, r
a4a0: 65 67 43 6f 6c 2b 69 29 3b 0a 20 20 20 20 20 20  egCol+i);.      
a4b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a4c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a4d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 43  MakeRecord, regC
a4e0: 6f 6c 2c 20 6e 43 6f 6c 2b 31 2c 20 72 65 67 53  ol, nCol+1, regS
a4f0: 61 6d 70 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ample);.#endif. 
a500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a510: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
a520: 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e  eRecord, regTabn
a530: 61 6d 65 2c 20 36 2c 20 72 65 67 54 65 6d 70 2c  ame, 6, regTemp,
a540: 20 22 62 62 62 62 62 62 22 2c 20 30 29 3b 0a 20   "bbbbbb", 0);. 
a550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a560: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a570: 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b  Rowid, iStatCur+
a580: 31 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b  1, regNewRowid);
a590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a5a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a5b0: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2b  nsert, iStatCur+
a5c0: 31 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e  1, regTemp, regN
a5d0: 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  ewRowid);.      
a5e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a5f0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
a600: 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
a610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
a620: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 73 4e  pHere(v, addrIsN
a630: 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ull);.    }.#end
a640: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
a650: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a660: 54 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 6e  T4 */..    /* En
a670: 64 20 6f 66 20 61 6e 61 6c 79 73 69 73 20 2a 2f  d of analysis */
a680: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a690: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a6a0: 52 65 77 69 6e 64 29 3b 0a 20 20 20 20 73 71 6c  Rewind);.    sql
a6b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
a6c0: 47 6f 74 6f 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a  GotoChng);.  }..
a6d0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 73  .  /* Create a s
a6e0: 69 6e 67 6c 65 20 73 71 6c 69 74 65 5f 73 74 61  ingle sqlite_sta
a6f0: 74 31 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e  t1 entry contain
a700: 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68 65 20  ing NULL as the 
a710: 69 6e 64 65 78 0a 20 20 2a 2a 20 6e 61 6d 65 20  index.  ** name 
a720: 61 6e 64 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  and the row coun
a730: 74 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  t as the content
a740: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 6e  ..  */.  if( pOn
a750: 6c 79 49 64 78 3d 3d 30 20 26 26 20 6e 65 65 64  lyIdx==0 && need
a760: 54 61 62 6c 65 43 6e 74 20 29 7b 0a 20 20 20 20  TableCnt ){.    
a770: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
a780: 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  "%s", pTab->zNam
a790: 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
a7a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a7b0: 5f 43 6f 75 6e 74 2c 20 69 54 61 62 43 75 72 2c  _Count, iTabCur,
a7c0: 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20   regStat1);.    
a7d0: 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69  jZeroRows = sqli
a7e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
a7f0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74   OP_IfNot, regSt
a800: 61 74 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  at1);.    sqlite
a810: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a820: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64  P_Null, 0, regId
a830: 78 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  xname);.    sqli
a840: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a850: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a860: 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72  regTabname, 3, r
a870: 65 67 54 65 6d 70 2c 20 22 61 61 61 22 2c 20 30  egTemp, "aaa", 0
a880: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a890: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a8a0: 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75  ewRowid, iStatCu
a8b0: 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b  r, regNewRowid);
a8c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
a8e0: 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72  ert, iStatCur, r
a8f0: 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f  egTemp, regNewRo
a900: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
a910: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a920: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
a930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a940: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65 72  JumpHere(v, jZer
a950: 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  oRows);.  }.}...
a960: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a970: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 61  ode that will ca
a980: 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  use the most rec
a990: 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79 73  ent index analys
a9a0: 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64  is to.** be load
a9b0: 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c  ed into internal
a9c0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 77 68 65   hash tables whe
a9d0: 72 65 20 69 73 20 63 61 6e 20 62 65 20 75 73 65  re is can be use
a9e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a9f0: 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 50  d loadAnalysis(P
aa00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
aa10: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
aa20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
aa30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
aa40: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
aa50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
aa60: 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c  OP_LoadAnalysis,
aa70: 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iDb);.  }.}../*
aa80: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
aa90: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
aaa0: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e  n analysis of an
aab0: 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
aac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aad0: 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28  analyzeDatabase(
aae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
aaf0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
ab00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ab10: 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70  >db;.  Schema *p
ab20: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
ab30: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20  [iDb].pSchema;  
ab40: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 64    /* Schema of d
ab50: 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20  atabase iDb */. 
ab60: 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20   HashElem *k;.  
ab70: 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20 20  int iStatCur;.  
ab80: 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20  int iMem;.  int 
ab90: 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33  iTab;..  sqlite3
aba0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
abb0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
abc0: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
abd0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
abe0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
abf0: 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54  = 3;.  openStatT
ac00: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
ac10: 2c 20 69 53 74 61 74 43 75 72 2c 20 30 2c 20 30  , iStatCur, 0, 0
ac20: 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61 72  );.  iMem = pPar
ac30: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54  se->nMem+1;.  iT
ac40: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ac50: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
ac60: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
ac70: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
ac80: 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  );.  for(k=sqlit
ac90: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
aca0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b  ema->tblHash); k
acb0: 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
acc0: 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(k)){.    Tabl
acd0: 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65  e *pTab = (Table
ace0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
acf0: 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65  (k);.    analyze
ad00: 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  OneTable(pParse,
ad10: 20 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74 43   pTab, 0, iStatC
ad20: 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62 29 3b  ur, iMem, iTab);
ad30: 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c 79  .  }.  loadAnaly
ad40: 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29  sis(pParse, iDb)
ad50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
ad60: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
ad70: 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  ll do an analysi
ad80: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61  s of a single ta
ad90: 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74 61  ble in.** a data
ada0: 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79 49  base.  If pOnlyI
adb0: 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  dx is not NULL t
adc0: 68 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e 67  hen it is a sing
add0: 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20 70  le index.** in p
ade0: 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64 20  Tab that should 
adf0: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a  be analyzed..*/.
ae00: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
ae10: 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  yzeTable(Parse *
ae20: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
ae30: 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e 6c  Tab, Index *pOnl
ae40: 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44 62  yIdx){.  int iDb
ae50: 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72  ;.  int iStatCur
ae60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
ae70: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
ae80: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
ae90: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50  ldsAllMutexes(pP
aea0: 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69  arse->db) );.  i
aeb0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
aec0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
aed0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
aee0: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ema);.  sqlite3B
aef0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
af00: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
af10: 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d  b);.  iStatCur =
af20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
af30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
af40: 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49   3;.  if( pOnlyI
af50: 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53 74  dx ){.    openSt
af60: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
af70: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70  iDb, iStatCur, p
af80: 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  OnlyIdx->zName, 
af90: 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  "idx");.  }else{
afa0: 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62  .    openStatTab
afb0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
afc0: 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d 3e  iStatCur, pTab->
afd0: 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a 20  zName, "tbl");. 
afe0: 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54   }.  analyzeOneT
aff0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
b000: 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53 74  b, pOnlyIdx, iSt
b010: 61 74 43 75 72 2c 70 50 61 72 73 65 2d 3e 6e 4d  atCur,pParse->nM
b020: 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e 54 61  em+1,pParse->nTa
b030: 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73  b);.  loadAnalys
b040: 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  is(pParse, iDb);
b050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b060: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
b070: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
b080: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
b090: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ls this routine.
b0a0: 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f 67  ** when it recog
b0b0: 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45  nizes an ANALYZE
b0c0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
b0d0: 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20         ANALYZE  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
b100: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
b110: 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20 20    <database>    
b120: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
b130: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
b140: 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  ZE  ?<database>.
b150: 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
b160: 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   3.**.** Form 1 
b170: 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
b180: 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
b190: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
b1a0: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20  be analyzed..** 
b1b0: 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20  Form 2 analyzes 
b1c0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65 20  all indices the 
b1d0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
b1e0: 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33  named..** Form 3
b1f0: 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e   analyzes all in
b200: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
b210: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
b220: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
b230: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50 61  qlite3Analyze(Pa
b240: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
b250: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
b260: 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71  n *pName2){.  sq
b270: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b280: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
b290: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  b;.  int i;.  ch
b2a0: 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54  ar *z, *zDb;.  T
b2b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
b2c0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b  dex *pIdx;.  Tok
b2d0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a  en *pTableName;.
b2e0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
b2f0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
b300: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
b310: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
b320: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
b330: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
b340: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
b350: 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  LL. */.  assert(
b360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
b370: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61  dsAllMutexes(pPa
b380: 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66  rse->db) );.  if
b390: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
b3a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
b3b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
b3c0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  turn;.  }..  ass
b3d0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c  ert( pName2!=0 |
b3e0: 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20  | pName1==0 );. 
b3f0: 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
b400: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a  {.    /* Form 1:
b410: 20 20 41 6e 61 6c 79 7a 65 20 65 76 65 72 79 74    Analyze everyt
b420: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hing */.    for(
b430: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
b440: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b450: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
b460: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c    /* Do not anal
b470: 79 7a 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  yze the TEMP dat
b480: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  abase */.      a
b490: 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70  nalyzeDatabase(p
b4a0: 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
b4b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
b4c0: 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  me2->n==0 ){.   
b4d0: 20 2f 2a 20 46 6f 72 6d 20 32 3a 20 20 41 6e 61   /* Form 2:  Ana
b4e0: 6c 79 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  lyze the databas
b4f0: 65 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 64  e or table named
b500: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
b510: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
b520: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
b530: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20   iDb>=0 ){.     
b540: 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65   analyzeDatabase
b550: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
b560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b570: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
b580: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
b590: 6d 65 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me1);.      if( 
b5a0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  z ){.        if(
b5b0: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   (pIdx = sqlite3
b5c0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
b5d0: 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
b5e0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
b5f0: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
b600: 70 54 61 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20  pTable, pIdx);. 
b610: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b620: 20 28 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33   (pTab = sqlite3
b630: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
b640: 73 65 2c 20 30 2c 20 7a 2c 20 30 29 29 21 3d 30  se, 0, z, 0))!=0
b650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 6e   ){.          an
b660: 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72 73  alyzeTable(pPars
b670: 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
b680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
b690: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b6a0: 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   z);.      }.   
b6b0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b6c0: 2f 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79  /* Form 3: Analy
b6d0: 7a 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ze the fully qua
b6e0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
b6f0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
b700: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
b710: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
b720: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c  , pName2, &pTabl
b730: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  eName);.    if( 
b740: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb>=0 ){.      
b750: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
b760: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
b770: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
b780: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
b790: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  bleName);.      
b7a0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
b7b0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
b7c0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
b7d0: 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b  , z, zDb))!=0 ){
b7e0: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
b7f0: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
b800: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49  pIdx->pTable, pI
b810: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  dx);.        }el
b820: 73 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73  se if( (pTab = s
b830: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
b840: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20  e(pParse, 0, z, 
b850: 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  zDb))!=0 ){.    
b860: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
b870: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
b880: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
b890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b8a0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
b8b0: 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20     }.    }   .  
b8c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20  }.}../*.** Used 
b8d0: 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
b8e0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e 61  ion from the ana
b8f0: 6c 79 7a 65 72 20 72 65 61 64 65 72 20 74 68 72  lyzer reader thr
b900: 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ough to the.** c
b910: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  allback routine.
b920: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
b930: 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20  ct analysisInfo 
b940: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74  analysisInfo;.st
b950: 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66  ruct analysisInf
b960: 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  o {.  sqlite3 *d
b970: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
b980: 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a  *zDatabase;.};..
b990: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
b9a0: 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20  argument points 
b9b0: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
b9c0: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
b9d0: 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20  ining a.** list 
b9e0: 6f 66 20 73 70 61 63 65 20 73 65 70 61 72 61 74  of space separat
b9f0: 65 64 20 69 6e 74 65 67 65 72 73 2e 20 52 65 61  ed integers. Rea
ba00: 64 20 74 68 65 20 66 69 72 73 74 20 6e 4f 75 74  d the first nOut
ba10: 20 6f 66 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a   of these into.*
ba20: 2a 20 74 68 65 20 61 72 72 61 79 20 61 4f 75 74  * the array aOut
ba30: 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  []..*/.static vo
ba40: 69 64 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61  id decodeIntArra
ba50: 79 28 0a 20 20 63 68 61 72 20 2a 7a 49 6e 74 41  y(.  char *zIntA
ba60: 72 72 61 79 2c 20 20 20 20 20 20 20 2f 2a 20 53  rray,       /* S
ba70: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
ba80: 20 69 6e 74 20 61 72 72 61 79 20 74 6f 20 64 65   int array to de
ba90: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  code */.  int nO
baa0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
bab0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
bac0: 6f 74 73 20 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f  ots in aOut[] */
bad0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74  .  tRowcnt *aOut
bae0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  ,         /* Sto
baf0: 72 65 20 69 6e 74 65 67 65 72 73 20 68 65 72 65  re integers here
bb00: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
bb10: 64 65 78 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dex          /* 
bb20: 48 61 6e 64 6c 65 20 65 78 74 72 61 20 66 6c 61  Handle extra fla
bb30: 67 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  gs for this inde
bb40: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
bb50: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  /.){.  char *z =
bb60: 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20 20 69 6e   zIntArray;.  in
bb70: 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t c;.  int i;.  
bb80: 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 23 69 66 64  tRowcnt v;..#ifd
bb90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bba0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
bbb0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
bbc0: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28   "";.#else.  if(
bbd0: 20 4e 45 56 45 52 28 7a 3d 3d 30 29 20 29 20 7a   NEVER(z==0) ) z
bbe0: 20 3d 20 22 22 3b 0a 23 65 6e 64 69 66 0a 20 20   = "";.#endif.  
bbf0: 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69  for(i=0; *z && i
bc00: 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOut; i++){.   
bc10: 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   v = 0;.    whil
bc20: 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27  e( (c=z[0])>='0'
bc30: 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20   && c<='9' ){.  
bc40: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63      v = v*10 + c
bc50: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b   - '0';.      z+
bc60: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 75  +;.    }.    aOu
bc70: 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66  t[i] = v;.    if
bc80: 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b  ( *z==' ' ) z++;
bc90: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
bca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bcb0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61 73 73 65  _OR_STAT4.  asse
bcc0: 72 74 28 20 70 49 6e 64 65 78 21 3d 30 20 29 3b  rt( pIndex!=0 );
bcd0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 49 6e  .#else.  if( pIn
bce0: 64 65 78 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b  dex ).#endif.  {
bcf0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
bd00: 7a 2c 20 22 75 6e 6f 72 64 65 72 65 64 22 29 3d  z, "unordered")=
bd10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
bd20: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
bd30: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
bd40: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
bd50: 62 28 22 73 7a 3d 5b 30 2d 39 5d 2a 22 2c 20 7a  b("sz=[0-9]*", z
bd60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
bd70: 74 20 76 33 32 20 3d 20 30 3b 0a 20 20 20 20 20  t v32 = 0;.     
bd80: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
bd90: 28 7a 2b 33 2c 20 26 76 33 32 29 3b 0a 20 20 20  (z+3, &v32);.   
bda0: 20 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49 64 78     pIndex->szIdx
bdb0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
bdc0: 45 73 74 28 76 33 32 29 3b 0a 20 20 20 20 7d 0a  Est(v32);.    }.
bdd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
bde0: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  s callback is in
bdf0: 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
be00: 61 63 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72  ach index when r
be10: 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71  eading the.** sq
be20: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
be30: 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72  .  .**.**     ar
be40: 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20  gv[0] = name of 
be50: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
be60: 20 61 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65 20   argv[1] = name 
be70: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 28 6d 69  of the index (mi
be80: 67 68 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  ght be NULL).** 
be90: 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 72 65      argv[2] = re
bea0: 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73 69  sults of analysi
beb0: 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20 66  s - on integer f
bec0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a  or each column.*
bed0: 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f 72  *.** Entries for
bee0: 20 77 68 69 63 68 20 61 72 67 76 5b 31 5d 3d 3d   which argv[1]==
bef0: 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63 6f  NULL simply reco
bf00: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
bf10: 20 72 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65 20   rows in.** the 
bf20: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
bf30: 20 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61   int analysisLoa
bf40: 64 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  der(void *pData,
bf50: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
bf60: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
bf70: 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79  otUsed){.  analy
bf80: 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  sisInfo *pInfo =
bf90: 20 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29   (analysisInfo*)
bfa0: 70 44 61 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a  pData;.  Index *
bfb0: 70 49 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65 20  pIndex;.  Table 
bfc0: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *pTable;.  const
bfd0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
bfe0: 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a  ert( argc==3 );.
bff0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c000: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61 72 67  ER2(NotUsed, arg
c010: 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 76 3d  c);..  if( argv=
c020: 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30  =0 || argv[0]==0
c030: 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20 29   || argv[2]==0 )
c040: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c050: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
c060: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
c070: 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b  pInfo->db, argv[
c080: 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61  0], pInfo->zData
c090: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 54 61  base);.  if( pTa
c0a0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ble==0 ){.    re
c0b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c0c0: 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a  ( argv[1]==0 ){.
c0d0: 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
c0e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
c0f0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 72 67 76  te3_stricmp(argv
c100: 5b 30 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d 30 20  [0],argv[1])==0 
c110: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  ){.    pIndex = 
c120: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
c130: 79 49 6e 64 65 78 28 70 54 61 62 6c 65 29 3b 0a  yIndex(pTable);.
c140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
c150: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
c160: 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62  dIndex(pInfo->db
c170: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f  , argv[1], pInfo
c180: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
c190: 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 32 5d 3b  }.  z = argv[2];
c1a0: 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ..  if( pIndex )
c1b0: 7b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41  {.    decodeIntA
c1c0: 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20 70  rray((char*)z, p
c1d0: 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31  Index->nKeyCol+1
c1e0: 2c 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  , pIndex->aiRowE
c1f0: 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  st, pIndex);.   
c200: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 50 61   if( pIndex->pPa
c210: 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20  rtIdxWhere==0 ) 
c220: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20  pTable->nRowEst 
c230: 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  = pIndex->aiRowE
c240: 73 74 5b 30 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  st[0];.  }else{.
c250: 20 20 20 20 49 6e 64 65 78 20 66 61 6b 65 49 64      Index fakeId
c260: 78 3b 0a 20 20 20 20 66 61 6b 65 49 64 78 2e 73  x;.    fakeIdx.s
c270: 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 6c 65  zIdxRow = pTable
c280: 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
c290: 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28  decodeIntArray((
c2a0: 63 68 61 72 2a 29 7a 2c 20 31 2c 20 26 70 54 61  char*)z, 1, &pTa
c2b0: 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 2c 20 26 66  ble->nRowEst, &f
c2c0: 61 6b 65 49 64 78 29 3b 0a 20 20 20 20 70 54 61  akeIdx);.    pTa
c2d0: 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  ble->szTabRow = 
c2e0: 66 61 6b 65 49 64 78 2e 73 7a 49 64 78 52 6f 77  fakeIdx.szIdxRow
c2f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c300: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
c310: 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65  he Index.aSample
c320: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
c330: 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68   NULL, delete th
c340: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
c350: 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e  y.** and its con
c360: 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tents..*/.void s
c370: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
c380: 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65 33  xSamples(sqlite3
c390: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
c3a0: 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  x){.#ifdef SQLIT
c3b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c3c0: 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 49  R_STAT4.  if( pI
c3d0: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20  dx->aSample ){. 
c3e0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f     int j;.    fo
c3f0: 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
c400: 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20  Sample; j++){.  
c410: 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20      IndexSample 
c420: 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d  *p = &pIdx->aSam
c430: 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 71  ple[j];.      sq
c440: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c450: 70 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p->p);.    }.   
c460: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c470: 62 2c 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  b, pIdx->aSample
c480: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 20  );.  }.  if( db 
c490: 26 26 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  && db->pnBytesFr
c4a0: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  eed==0 ){.    pI
c4b0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->nSample = 0;
c4c0: 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70  .    pIdx->aSamp
c4d0: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c 73  le = 0;.  }.#els
c4e0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
c4f0: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
c500: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49 64  ED_PARAMETER(pId
c510: 78 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  x);.#endif /* SQ
c520: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c530: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a  3_OR_STAT4 */.}.
c540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c550: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
c560: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  TAT4./*.** Popul
c570: 61 74 65 20 74 68 65 20 70 49 64 78 2d 3e 61 41  ate the pIdx->aA
c580: 76 67 45 71 5b 5d 20 61 72 72 61 79 20 62 61 73  vgEq[] array bas
c590: 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 70 6c 65  ed on the sample
c5a0: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73  s currently.** s
c5b0: 74 6f 72 65 64 20 69 6e 20 70 49 64 78 2d 3e 61  tored in pIdx->a
c5c0: 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73 74  Sample[]. .*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 41 76  atic void initAv
c5e0: 67 45 71 28 49 6e 64 65 78 20 2a 70 49 64 78 29  gEq(Index *pIdx)
c5f0: 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a  {.  if( pIdx ){.
c600: 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20      IndexSample 
c610: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
c620: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20 49 6e  >aSample;.    In
c630: 64 65 78 53 61 6d 70 6c 65 20 2a 70 46 69 6e 61  dexSample *pFina
c640: 6c 20 3d 20 26 61 53 61 6d 70 6c 65 5b 70 49 64  l = &aSample[pId
c650: 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20  x->nSample-1];. 
c660: 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
c670: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
c680: 6c 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  l<pIdx->nKeyCol;
c690: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
c6a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
c6c0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
c6d0: 6f 75 67 68 20 73 61 6d 70 6c 65 73 20 2a 2f 0a  ough samples */.
c6e0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 73 75        tRowcnt su
c6f0: 6d 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mEq = 0;        
c700: 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65 20 6e 45  /* Sum of the nE
c710: 71 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  q values */.    
c720: 20 20 74 52 6f 77 63 6e 74 20 6e 53 75 6d 20 3d    tRowcnt nSum =
c730: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
c740: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63  umber of terms c
c750: 6f 6e 74 72 69 62 75 74 69 6e 67 20 74 6f 20 73  ontributing to s
c760: 75 6d 45 71 20 2a 2f 0a 20 20 20 20 20 20 74 52  umEq */.      tR
c770: 6f 77 63 6e 74 20 61 76 67 45 71 20 3d 20 30 3b  owcnt avgEq = 0;
c780: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  .      tRowcnt n
c790: 44 4c 74 20 3d 20 70 46 69 6e 61 6c 2d 3e 61 6e  DLt = pFinal->an
c7a0: 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 20 20  DLt[iCol];..    
c7b0: 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d 20 74 6f    /* Set nSum to
c7c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
c7d0: 69 73 74 69 6e 63 74 20 28 69 43 6f 6c 2b 31 29  istinct (iCol+1)
c7e0: 20 66 69 65 6c 64 20 70 72 65 66 69 78 65 73 20   field prefixes 
c7f0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6f 63  that.      ** oc
c800: 63 75 72 20 69 6e 20 74 68 65 20 73 74 61 74 34  cur in the stat4
c810: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20   table for this 
c820: 69 6e 64 65 78 20 62 65 66 6f 72 65 20 70 46 69  index before pFi
c830: 6e 61 6c 2e 20 53 65 74 0a 20 20 20 20 20 20 2a  nal. Set.      *
c840: 2a 20 73 75 6d 45 71 20 74 6f 20 74 68 65 20 73  * sumEq to the s
c850: 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20 76 61  um of the nEq va
c860: 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  lues for column 
c870: 69 43 6f 6c 20 66 6f 72 20 74 68 65 20 73 61 6d  iCol for the sam
c880: 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 28  e.      ** set (
c890: 61 64 64 69 6e 67 20 74 68 65 20 76 61 6c 75 65  adding the value
c8a0: 20 6f 6e 6c 79 20 6f 6e 63 65 20 77 68 65 72 65   only once where
c8b0: 20 74 68 65 72 65 20 65 78 69 73 74 20 64 75 70   there exist dup
c8c0: 69 63 61 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  icate .      ** 
c8d0: 70 72 65 66 69 78 65 73 29 2e 20 20 2a 2f 0a 20  prefixes).  */. 
c8e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c8f0: 28 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31  (pIdx->nSample-1
c900: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
c910: 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
c920: 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d 61 53 61  anDLt[iCol]!=aSa
c930: 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44 4c 74 5b  mple[i+1].anDLt[
c940: 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  iCol] ){.       
c950: 20 20 20 73 75 6d 45 71 20 2b 3d 20 61 53 61 6d     sumEq += aSam
c960: 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
c970: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 75  ];.          nSu
c980: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m++;.        }. 
c990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c9a0: 20 6e 44 4c 74 3e 6e 53 75 6d 20 29 7b 0a 20 20   nDLt>nSum ){.  
c9b0: 20 20 20 20 20 20 61 76 67 45 71 20 3d 20 28 70        avgEq = (p
c9c0: 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69 43 6f 6c  Final->anLt[iCol
c9d0: 5d 20 2d 20 73 75 6d 45 71 29 2f 28 6e 44 4c 74  ] - sumEq)/(nDLt
c9e0: 20 2d 20 6e 53 75 6d 29 3b 0a 20 20 20 20 20 20   - nSum);.      
c9f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 76 67 45  }.      if( avgE
ca00: 71 3d 3d 30 20 29 20 61 76 67 45 71 20 3d 20 31  q==0 ) avgEq = 1
ca10: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41  ;.      pIdx->aA
ca20: 76 67 45 71 5b 69 43 6f 6c 5d 20 3d 20 61 76 67  vgEq[iCol] = avg
ca30: 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  Eq;.      if( pI
ca40: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3d 3d  dx->nSampleCol==
ca50: 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  1 ) break;.    }
ca60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
ca70: 6f 6b 20 75 70 20 61 6e 20 69 6e 64 65 78 20 62  ok up an index b
ca80: 79 20 6e 61 6d 65 2e 20 20 4f 72 2c 20 69 66 20  y name.  Or, if 
ca90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 57 49  the name of a WI
caa0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
cab0: 65 0a 2a 2a 20 69 73 20 73 75 70 70 6c 69 65 64  e.** is supplied
cac0: 20 69 6e 73 74 65 61 64 2c 20 66 69 6e 64 20 74   instead, find t
cad0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
cae0: 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 61  ndex for that ta
caf0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49  ble..*/.static I
cb00: 6e 64 65 78 20 2a 66 69 6e 64 49 6e 64 65 78 4f  ndex *findIndexO
cb10: 72 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 73  rPrimaryKey(.  s
cb20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
cb30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
cb40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cb50: 44 62 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Db.){.  Index *p
cb60: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
cb70: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
cb80: 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 49  , zDb);.  if( pI
cb90: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  dx==0 ){.    Tab
cba0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
cbb0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
cbc0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
cbd0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 48 61   if( pTab && !Ha
cbe0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
cbf0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 50 72 69  Idx = sqlite3Pri
cc00: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
cc10: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
cc20: 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pIdx;.}../*.** 
cc30: 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Load the content
cc40: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
cc50: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 6f 72   sqlite_stat4 or
cc60: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
cc70: 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ble .** into the
cc80: 20 72 65 6c 65 76 61 6e 74 20 49 6e 64 65 78 2e   relevant Index.
cc90: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73  aSample[] arrays
cca0: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
ccb0: 73 20 7a 53 71 6c 31 20 61 6e 64 20 7a 53 71 6c  s zSql1 and zSql
ccc0: 32 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  2 must point to 
ccd0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74  SQL statements t
cce0: 68 61 74 20 72 65 74 75 72 6e 0a 2a 2a 20 64 61  hat return.** da
ccf0: 74 61 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ta equivalent to
cd00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
cd10: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 64  statements are d
cd20: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 73 74 61  ifferent for sta
cd30: 74 33 2c 0a 2a 2a 20 73 65 65 20 74 68 65 20 63  t3,.** see the c
cd40: 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
cd50: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
cd60: 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 7a 53  ls):.**.**    zS
cd70: 71 6c 31 3a 20 53 45 4c 45 43 54 20 69 64 78 2c  ql1: SELECT idx,
cd80: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51  count(*) FROM %Q
cd90: 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47 52  .sqlite_stat4 GR
cda0: 4f 55 50 20 42 59 20 69 64 78 0a 2a 2a 20 20 20  OUP BY idx.**   
cdb0: 20 7a 53 71 6c 32 3a 20 53 45 4c 45 43 54 20 69   zSql2: SELECT i
cdc0: 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c  dx,neq,nlt,ndlt,
cdd0: 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73  sample FROM %Q.s
cde0: 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2a 0a 2a  qlite_stat4.**.*
cdf0: 2a 20 77 68 65 72 65 20 25 51 20 69 73 20 72 65  * where %Q is re
ce00: 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20  placed with the 
ce10: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 62 65  database name be
ce20: 66 6f 72 65 20 74 68 65 20 53 51 4c 20 69 73 20  fore the SQL is 
ce30: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
ce40: 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61 74  tic int loadStat
ce50: 54 62 6c 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tbl(.  sqlite3 *
ce60: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
ce70: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
ce80: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
ce90: 20 62 53 74 61 74 33 2c 20 20 20 20 20 20 20 20   bStat3,        
cea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
ceb0: 73 75 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75  sume single colu
cec0: 6d 6e 20 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20  mn records only 
ced0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
cee0: 2a 7a 53 71 6c 31 2c 20 20 20 20 20 20 20 20 20  *zSql1,         
cef0: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
cf00: 65 6e 74 20 31 20 28 73 65 65 20 61 62 6f 76 65  ent 1 (see above
cf10: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ) */.  const cha
cf20: 72 20 2a 7a 53 71 6c 32 2c 20 20 20 20 20 20 20  r *zSql2,       
cf30: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
cf40: 65 6d 65 6e 74 20 32 20 28 73 65 65 20 61 62 6f  ement 2 (see abo
cf50: 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ve) */.  const c
cf60: 68 61 72 20 2a 7a 44 62 20 20 20 20 20 20 20 20  har *zDb        
cf70: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cf80: 73 65 20 6e 61 6d 65 20 28 65 2e 67 2e 20 22 6d  se name (e.g. "m
cf90: 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ain") */.){.  in
cfa0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cfc0: 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d  esult codes from
cfd0: 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
cfe0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cff0: 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20  pStmt = 0;      
d000: 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
d010: 65 6e 74 20 62 65 69 6e 67 20 72 75 6e 20 2a 2f  ent being run */
d020: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  .  char *zSql;  
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
d050: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
d060: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 65 76 49  .  Index *pPrevI
d070: 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
d080: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 69 6e 64   /* Previous ind
d090: 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a  ex in the loop *
d0a0: 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  /.  IndexSample 
d0b0: 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20  *pSample;       
d0c0: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70    /* A slot in p
d0d0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a  Idx->aSample[] *
d0e0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  /..  assert( db-
d0f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
d100: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 7a 53 71 6c  led==0 );.  zSql
d110: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d120: 66 28 64 62 2c 20 7a 53 71 6c 31 2c 20 7a 44 62  f(db, zSql1, zDb
d130: 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29  );.  if( !zSql )
d140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d150: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
d170: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
d180: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
d190: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d1a0: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  db, zSql);.  if(
d1b0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d1c0: 0a 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ..  while( sqlit
d1d0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
d1e0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
d1f0: 20 20 69 6e 74 20 6e 49 64 78 43 6f 6c 20 3d 20    int nIdxCol = 
d200: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
d210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
d220: 75 6d 6e 73 20 69 6e 20 73 74 61 74 34 20 72 65  umns in stat4 re
d230: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 69 6e 74  cords */.    int
d240: 20 6e 41 76 67 43 6f 6c 20 3d 20 31 3b 20 20 20   nAvgCol = 1;   
d250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d260: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
d270: 69 6e 20 49 6e 64 65 78 2e 61 41 76 67 45 71 20  in Index.aAvgEq 
d280: 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  */..    char *zI
d290: 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ndex;   /* Index
d2a0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
d2b0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20  ex *pIdx;    /* 
d2c0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  Pointer to the i
d2d0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
d2e0: 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20     int nSample; 
d2f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d300: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 69  samples */.    i
d310: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 2f  nt nByte;      /
d320: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
d330: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
d340: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
d350: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
d360: 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  ce required */. 
d370: 20 20 20 74 52 6f 77 63 6e 74 20 2a 70 53 70 61     tRowcnt *pSpa
d380: 63 65 3b 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20  ce;..    zIndex 
d390: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
d3a0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
d3b0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
d3c0: 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e   zIndex==0 ) con
d3d0: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70  tinue;.    nSamp
d3e0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  le = sqlite3_col
d3f0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
d400: 29 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  );.    pIdx = fi
d410: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
d420: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
d430: 7a 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zDb);.    assert
d440: 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74  ( pIdx==0 || bSt
d450: 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61  at3 || pIdx->nSa
d460: 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  mple==0 );.    /
d470: 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20  * Index.nSample 
d480: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74  is non-zero at t
d490: 68 69 73 20 70 6f 69 6e 74 20 69 66 20 64 61 74  his point if dat
d4a0: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
d4b0: 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64  en.    ** loaded
d4c0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 34 20   from the stat4 
d4d0: 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  table. In this c
d4e0: 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33  ase ignore stat3
d4f0: 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69   data.  */.    i
d500: 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49  f( pIdx==0 || pI
d510: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f  dx->nSample ) co
d520: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
d530: 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20  bStat3==0 ){.   
d540: 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64     nIdxCol = pId
d550: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b 0a 20 20  x->nKeyCol+1;.  
d560: 20 20 20 20 6e 41 76 67 43 6f 6c 20 3d 20 70 49      nAvgCol = pI
d570: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
d580: 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61   }.    pIdx->nSa
d590: 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78 43 6f  mpleCol = nIdxCo
d5a0: 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  l;.    nByte = s
d5b0: 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d 70 6c  izeof(IndexSampl
d5c0: 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20  e) * nSample;.  
d5d0: 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f    nByte += sizeo
d5e0: 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 49 64  f(tRowcnt) * nId
d5f0: 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61 6d 70  xCol * 3 * nSamp
d600: 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d  le;.    nByte +=
d610: 20 6e 41 76 67 43 6f 6c 20 2a 20 73 69 7a 65 6f   nAvgCol * sizeo
d620: 66 28 74 52 6f 77 63 6e 74 29 3b 20 20 20 20 20  f(tRowcnt);     
d630: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 49 6e 64  /* Space for Ind
d640: 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f 0a 0a  ex.aAvgEq[] */..
d650: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
d660: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
d670: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d680: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  e);.    if( pIdx
d690: 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a  ->aSample==0 ){.
d6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
d6b0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
d6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d6d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
d6e0: 20 20 20 20 70 53 70 61 63 65 20 3d 20 28 74 52      pSpace = (tR
d6f0: 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61 53  owcnt*)&pIdx->aS
d700: 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a  ample[nSample];.
d710: 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71      pIdx->aAvgEq
d720: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
d730: 65 20 2b 3d 20 6e 41 76 67 43 6f 6c 3b 0a 20 20  e += nAvgCol;.  
d740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61    for(i=0; i<nSa
d750: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
d760: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b    pIdx->aSample[
d770: 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61 63 65  i].anEq = pSpace
d780: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
d790: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  Col;.      pIdx-
d7a0: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74  >aSample[i].anLt
d7b0: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
d7c0: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
d7d0: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
d7e0: 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53 70  e[i].anDLt = pSp
d7f0: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e  ace; pSpace += n
d800: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20  IdxCol;.    }.  
d810: 20 20 61 73 73 65 72 74 28 20 28 28 75 38 2a 29    assert( ((u8*)
d820: 70 53 70 61 63 65 29 2d 6e 42 79 74 65 3d 3d 28  pSpace)-nByte==(
d830: 75 38 2a 29 28 70 49 64 78 2d 3e 61 53 61 6d 70  u8*)(pIdx->aSamp
d840: 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  le) );.  }.  rc 
d850: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
d860: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
d870: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d880: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
d890: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53  e3MPrintf(db, zS
d8a0: 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  ql2, zDb);.  if(
d8b0: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65   !zSql ){.    re
d8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d8d0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
d8e0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
d8f0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
d900: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
d910: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
d920: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
d930: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
d940: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
d950: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
d960: 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  OW ){.    char *
d970: 7a 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  zIndex;         
d980: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d990: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
d9a0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
d9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
d9c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64  inter to the ind
d9d0: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ex object */.   
d9e0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20 20   int nCol = 1;  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
da10: 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  mns in index */.
da20: 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63  .    zIndex = (c
da30: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
da40: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
da50: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e   0);.    if( zIn
da60: 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dex==0 ) continu
da70: 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  e;.    pIdx = fi
da80: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
da90: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
daa0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
dab0: 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dx==0 ) continue
dac0: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6e 65  ;.    /* This ne
dad0: 78 74 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  xt condition is 
dae0: 74 72 75 65 20 69 66 20 64 61 74 61 20 68 61 73  true if data has
daf0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f   already been lo
db00: 61 64 65 64 20 66 72 6f 6d 20 0a 20 20 20 20 2a  aded from .    *
db10: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * the sqlite_sta
db20: 74 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69  t4 table. In thi
db30: 73 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74  s case ignore st
db40: 61 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  at3 data.  */.  
db50: 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e    nCol = pIdx->n
db60: 53 61 6d 70 6c 65 43 6f 6c 3b 0a 20 20 20 20 69  SampleCol;.    i
db70: 66 28 20 62 53 74 61 74 33 20 26 26 20 6e 43 6f  f( bStat3 && nCo
db80: 6c 3e 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  l>1 ) continue;.
db90: 20 20 20 20 69 66 28 20 70 49 64 78 21 3d 70 50      if( pIdx!=pP
dba0: 72 65 76 49 64 78 20 29 7b 0a 20 20 20 20 20 20  revIdx ){.      
dbb0: 69 6e 69 74 41 76 67 45 71 28 70 50 72 65 76 49  initAvgEq(pPrevI
dbc0: 64 78 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  dx);.      pPrev
dbd0: 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
dbe0: 7d 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  }.    pSample = 
dbf0: 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 70  &pIdx->aSample[p
dc00: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  Idx->nSample];. 
dc10: 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61     decodeIntArra
dc20: 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  y((char*)sqlite3
dc30: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
dc40: 6d 74 2c 31 29 2c 20 6e 43 6f 6c 2c 20 70 53 61  mt,1), nCol, pSa
dc50: 6d 70 6c 65 2d 3e 61 6e 45 71 2c 20 30 29 3b 0a  mple->anEq, 0);.
dc60: 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72      decodeIntArr
dc70: 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  ay((char*)sqlite
dc80: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
dc90: 74 6d 74 2c 32 29 2c 20 6e 43 6f 6c 2c 20 70 53  tmt,2), nCol, pS
dca0: 61 6d 70 6c 65 2d 3e 61 6e 4c 74 2c 20 30 29 3b  ample->anLt, 0);
dcb0: 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74 41 72  .    decodeIntAr
dcc0: 72 61 79 28 28 63 68 61 72 2a 29 73 71 6c 69 74  ray((char*)sqlit
dcd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
dce0: 53 74 6d 74 2c 33 29 2c 20 6e 43 6f 6c 2c 20 70  Stmt,3), nCol, p
dcf0: 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30 29  Sample->anDLt,0)
dd00: 3b 0a 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61  ;..    /* Take a
dd10: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 61 6d   copy of the sam
dd20: 70 6c 65 2e 20 41 64 64 20 74 77 6f 20 30 78 30  ple. Add two 0x0
dd30: 30 20 62 79 74 65 73 20 74 68 65 20 65 6e 64 20  0 bytes the end 
dd40: 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 0a 20  of the buffer.. 
dd50: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6e     ** This is in
dd60: 20 63 61 73 65 20 74 68 65 20 73 61 6d 70 6c 65   case the sample
dd70: 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
dd80: 70 74 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61  pted. In that ca
dd90: 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  se, the.    ** s
dda0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
ddb0: 43 6f 6d 70 61 72 65 28 29 20 6d 61 79 20 72 65  Compare() may re
ddc0: 61 64 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72  ad up to two var
ddd0: 69 6e 74 73 20 70 61 73 74 20 74 68 65 0a 20 20  ints past the.  
dde0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
ddf0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
de00: 20 62 65 66 6f 72 65 20 69 74 20 72 65 61 6c 69   before it reali
de10: 7a 65 73 20 69 74 20 69 73 20 64 65 61 6c 69 6e  zes it is dealin
de20: 67 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20  g with.    ** a 
de30: 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64 2e 20  corrupt record. 
de40: 41 64 64 69 6e 67 20 74 68 65 20 74 77 6f 20 30  Adding the two 0
de50: 78 30 30 20 62 79 74 65 73 20 70 72 65 76 65 6e  x00 bytes preven
de60: 74 73 20 74 68 69 73 20 66 72 6f 6d 20 63 61 75  ts this from cau
de70: 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 62 75  sing.    ** a bu
de80: 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20  ffer overread.  
de90: 2a 2f 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  */.    pSample->
dea0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
deb0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
dec0: 34 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  4);.    pSample-
ded0: 3e 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >p = sqlite3DbMa
dee0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 70 53 61  llocZero(db, pSa
def0: 6d 70 6c 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20  mple->n + 2);.  
df00: 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70    if( pSample->p
df10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
df20: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
df30: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
df40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
df50: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
df60: 79 28 70 53 61 6d 70 6c 65 2d 3e 70 2c 20 73 71  y(pSample->p, sq
df70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
df80: 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 70 53 61  b(pStmt, 4), pSa
df90: 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 49  mple->n);.    pI
dfa0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20  dx->nSample++;. 
dfb0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
dfc0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
dfd0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
dfe0: 49 54 45 5f 4f 4b 20 29 20 69 6e 69 74 41 76 67  ITE_OK ) initAvg
dff0: 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20 20  Eq(pPrevIdx);.  
e000: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e010: 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e 74  .** Load content
e020: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
e030: 5f 73 74 61 74 34 20 61 6e 64 20 73 71 6c 69 74  _stat4 and sqlit
e040: 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20 69  e_stat3 tables i
e050: 6e 74 6f 20 0a 2a 2a 20 74 68 65 20 49 6e 64 65  nto .** the Inde
e060: 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  x.aSample[] arra
e070: 79 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65  ys of all indice
e080: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
e090: 20 6c 6f 61 64 53 74 61 74 34 28 73 71 6c 69 74   loadStat4(sqlit
e0a0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
e0b0: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20  ar *zDb){.  int 
e0c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e0e0: 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d  esult codes from
e0f0: 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
e100: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
e110: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e120: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  d==0 );.  if( sq
e130: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
e140: 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
e150: 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72  ", zDb) ){.    r
e160: 63 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c 28  c = loadStatTbl(
e170: 64 62 2c 20 30 2c 0a 20 20 20 20 20 20 22 53 45  db, 0,.      "SE
e180: 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a  LECT idx,count(*
e190: 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  ) FROM %Q.sqlite
e1a0: 5f 73 74 61 74 34 20 47 52 4f 55 50 20 42 59 20  _stat4 GROUP BY 
e1b0: 69 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53 45  idx", .      "SE
e1c0: 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74  LECT idx,neq,nlt
e1d0: 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f  ,ndlt,sample FRO
e1e0: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
e1f0: 34 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20  4",.      zDb.  
e200: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
e210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e220: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
e230: 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
e240: 61 74 33 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20  at3", zDb) ){.  
e250: 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74 54    rc = loadStatT
e260: 62 6c 28 64 62 2c 20 31 2c 0a 20 20 20 20 20 20  bl(db, 1,.      
e270: 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e  "SELECT idx,coun
e280: 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c  t(*) FROM %Q.sql
e290: 69 74 65 5f 73 74 61 74 33 20 47 52 4f 55 50 20  ite_stat3 GROUP 
e2a0: 42 59 20 69 64 78 22 2c 20 0a 20 20 20 20 20 20  BY idx", .      
e2b0: 22 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c  "SELECT idx,neq,
e2c0: 6e 6c 74 2c 6e 64 6c 74 2c 73 71 6c 69 74 65 5f  nlt,ndlt,sqlite_
e2d0: 72 65 63 6f 72 64 28 73 61 6d 70 6c 65 29 20 46  record(sample) F
e2e0: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
e2f0: 61 74 33 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a  at3",.      zDb.
e300: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65      );.  }..  re
e310: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
e320: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
e330: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
e340: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  4 */../*.** Load
e350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
e360: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
e370: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
e380: 33 2f 34 20 74 61 62 6c 65 73 2e 20 54 68 65 0a  3/4 tables. The.
e390: 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73  ** contents of s
e3a0: 71 6c 69 74 65 5f 73 74 61 74 31 20 61 72 65 20  qlite_stat1 are 
e3b0: 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65  used to populate
e3c0: 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
e3d0: 45 73 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e  Est[].** arrays.
e3e0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
e3f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20   sqlite_stat3/4 
e400: 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75  are used to popu
e410: 6c 61 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65  late the.** Inde
e420: 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  x.aSample[] arra
e430: 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
e440: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
e450: 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ble is not prese
e460: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
e470: 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  se, SQLITE_ERROR
e480: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
e490: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
e4a0: 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ven if SQLITE_EN
e4b0: 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77 61 73  ABLE_STAT3/4 was
e4c0: 20 64 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72   defined .** dur
e4d0: 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ing compilation 
e4e0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  and the sqlite_s
e4f0: 74 61 74 33 2f 34 20 74 61 62 6c 65 20 69 73 20  tat3/4 table is 
e500: 70 72 65 73 65 6e 74 2c 20 6e 6f 20 64 61 74 61  present, no data
e510: 20 69 73 20 0a 2a 2a 20 72 65 61 64 20 66 72 6f   is .** read fro
e520: 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  m it..**.** If S
e530: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
e540: 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e 65 64  T3/4 was defined
e550: 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74   during compilat
e560: 69 6f 6e 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ion and the .** 
e570: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62  sqlite_stat4 tab
e580: 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  le is not presen
e590: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
e5a0: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  e, SQLITE_ERROR 
e5b0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
e5c0: 48 6f 77 65 76 65 72 2c 20 69 6e 20 74 68 69 73  However, in this
e5d0: 20 63 61 73 65 2c 20 64 61 74 61 20 69 73 20 72   case, data is r
e5e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ead from the sql
e5f0: 69 74 65 5f 73 74 61 74 31 0a 2a 2a 20 74 61 62  ite_stat1.** tab
e600: 6c 65 20 28 69 66 20 69 74 20 69 73 20 70 72 65  le (if it is pre
e610: 73 65 6e 74 29 20 62 65 66 6f 72 65 20 72 65 74  sent) before ret
e620: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
e630: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
e640: 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63 74  curs, this funct
e650: 69 6f 6e 20 61 6c 77 61 79 73 20 73 65 74 73 20  ion always sets 
e660: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e670: 2e 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  ..** This means 
e680: 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 6f  if the caller do
e690: 65 73 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  es not care abou
e6a0: 74 20 6f 74 68 65 72 20 65 72 72 6f 72 73 2c 20  t other errors, 
e6b0: 74 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 63 6f  the return.** co
e6c0: 64 65 20 6d 61 79 20 62 65 20 69 67 6e 6f 72 65  de may be ignore
e6d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e6e0: 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73 71  3AnalysisLoad(sq
e6f0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
e700: 44 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49  Db){.  analysisI
e710: 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73  nfo sInfo;.  Has
e720: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72  hElem *i;.  char
e730: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63   *zSql;.  int rc
e740: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
e750: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
e760: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
e770: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
e780: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  !=0 );..  /* Cle
e790: 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61  ar any prior sta
e7a0: 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73 73  tistics */.  ass
e7b0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
e7c0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
e7d0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72  iDb, 0) );.  for
e7e0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
e7f0: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d  st(&db->aDb[iDb]
e800: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
e810: 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  h);i;i=sqliteHas
e820: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49  hNext(i)){.    I
e830: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
e840: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
e850: 20 20 20 20 73 71 6c 69 74 65 33 44 65 66 61 75      sqlite3Defau
e860: 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a  ltRowEst(pIdx);.
e870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e880: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
e890: 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44  AT4.    sqlite3D
e8a0: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
e8b0: 73 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20  s(db, pIdx);.   
e8c0: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d   pIdx->aSample =
e8d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   0;.#endif.  }..
e8e0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
e8f0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 71 6c 69  ke sure the sqli
e900: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 65  te_stat1 table e
e910: 78 69 73 74 73 20 2a 2f 0a 20 20 73 49 6e 66 6f  xists */.  sInfo
e920: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66  .db = db;.  sInf
e930: 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62  o.zDatabase = db
e940: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
e950: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
e960: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
e970: 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e  lite_stat1", sIn
e980: 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3d 3d 30  fo.zDatabase)==0
e990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e9a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
e9b0: 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20  ..  /* Load new 
e9c0: 73 74 61 74 69 73 74 69 63 73 20 6f 75 74 20 6f  statistics out o
e9d0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  f the sqlite_sta
e9e0: 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 53  t1 table */.  zS
e9f0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
ea00: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 22  ntf(db, .      "
ea10: 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73  SELECT tbl,idx,s
ea20: 74 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  tat FROM %Q.sqli
ea30: 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f  te_stat1", sInfo
ea40: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
ea50: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
ea60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
ea70: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
ea80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
ea90: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e  xec(db, zSql, an
eaa0: 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26 73  alysisLoader, &s
eab0: 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 73 71  Info, 0);.    sq
eac0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ead0: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  zSql);.  }...  /
eae0: 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74 69  * Load the stati
eaf0: 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73  stics from the s
eb00: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
eb10: 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e. */.#ifdef SQL
eb20: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
eb30: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
eb40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eb50: 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 73 69  .    int lookasi
eb60: 64 65 45 6e 61 62 6c 65 64 20 3d 20 64 62 2d 3e  deEnabled = db->
eb70: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
eb80: 65 64 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ed;.    db->look
eb90: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
eba0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61   0;.    rc = loa
ebb0: 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66 6f  dStat4(db, sInfo
ebc0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
ebd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
ebe0: 45 6e 61 62 6c 65 64 20 3d 20 6c 6f 6f 6b 61 73  Enabled = lookas
ebf0: 69 64 65 45 6e 61 62 6c 65 64 3b 0a 20 20 7d 0a  ideEnabled;.  }.
ec00: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
ec10: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
ec20: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
ec30: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
ec40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ec50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ec60: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
ec70: 2f 0a                                            /.