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

Artifact 31a1ea5a5a355097aa7a5fce09bbd9ae2a2c7672:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4a 75 6c 79 20  /*.** 2005 July 
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a  ****************
0170: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f  ntains code asso
0190: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
01a0: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
01b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59  .**.** The ANALY
01c0: 5a 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65  ZE command gathe
01d0: 72 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f  r statistics abo
01e0: 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
01f0: 66 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  f tables.** and 
0200: 69 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20  indices.  These 
0210: 73 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d  statistics are m
0220: 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ade available to
0230: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
0240: 65 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74  er.** to help it
0250: 20 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63   make better dec
0260: 69 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77  isions about how
0270: 20 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72   to perform quer
0280: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ies..**.** The f
0290: 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
02a0: 74 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61  tables are or ha
02b0: 76 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65  ve been supporte
02c0: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  d:.**.**    CREA
02d0: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
02e0: 73 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20  stat1(tbl, idx, 
02f0: 73 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45  stat);.**    CRE
0300: 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65  ATE TABLE sqlite
0310: 5f 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c  _stat2(tbl, idx,
0320: 20 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c   sampleno, sampl
0330: 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  e);.**    CREATE
0340: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74   TABLE sqlite_st
0350: 61 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 4c  at3(tbl, idx, nL
0360: 74 2c 20 6e 45 71 2c 20 73 61 6d 70 6c 65 29 3b  t, nEq, sample);
0370: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
0380: 6c 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62  l tables might b
0390: 65 20 61 64 64 65 64 20 69 6e 20 66 75 74 75 72  e added in futur
03a0: 65 20 72 65 6c 65 61 73 65 73 20 6f 66 20 53 51  e releases of SQ
03b0: 4c 69 74 65 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  Lite..** The sql
03c0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
03d0: 69 73 20 6e 6f 74 20 63 72 65 61 74 65 64 20 6f  is not created o
03e0: 72 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  r used unless th
03f0: 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
0400: 0a 2a 2a 20 69 73 20 62 65 74 77 65 65 6e 20 33  .** is between 3
0410: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 37 2c  .6.18 and 3.7.7,
0420: 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20   inclusive, and 
0430: 75 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73  unless SQLite is
0440: 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
0450: 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  h SQLITE_ENABLE_
0460: 53 54 41 54 32 2e 20 20 54 68 65 20 73 71 6c 69  STAT2.  The sqli
0470: 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20 69  te_stat2 table i
0480: 73 20 64 65 70 72 65 63 61 74 65 64 2e 0a 2a 2a  s deprecated..**
0490: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
04a0: 32 20 74 61 62 6c 65 20 69 73 20 73 75 70 65 72  2 table is super
04b0: 63 65 64 65 64 20 62 79 20 73 71 6c 69 74 65 5f  ceded by sqlite_
04c0: 73 74 61 74 33 2c 20 77 68 69 63 68 20 69 73 20  stat3, which is 
04d0: 6f 6e 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 20  only.** created 
04e0: 61 6e 64 20 75 73 65 64 20 62 79 20 53 51 4c 69  and used by SQLi
04f0: 74 65 20 76 65 72 73 69 6f 6e 73 20 61 66 74 65  te versions afte
0500: 72 20 32 30 31 31 2d 30 38 2d 30 39 20 77 69 74  r 2011-08-09 wit
0510: 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  h.** SQLITE_ENAB
0520: 4c 45 5f 53 54 41 54 33 20 64 65 66 69 6e 65 64  LE_STAT3 defined
0530: 2e 20 20 54 68 65 20 66 75 63 6e 74 69 6f 6e 61  .  The fucntiona
0540: 6c 69 74 79 20 6f 66 20 73 71 6c 69 74 65 5f 73  lity of sqlite_s
0550: 74 61 74 33 0a 2a 2a 20 69 73 20 61 20 73 75 70  tat3.** is a sup
0560: 65 72 73 65 74 20 6f 66 20 73 71 6c 69 74 65 5f  erset of sqlite_
0570: 73 74 61 74 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 46  stat2.  .**.** F
0580: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
0590: 73 74 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  stat1:.**.** The
05a0: 72 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f  re is normally o
05b0: 6e 65 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78  ne row per index
05c0: 2c 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  , with the index
05d0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
05e0: 68 65 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  he.** name in th
05f0: 65 20 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54  e idx column.  T
0600: 68 65 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73  he tbl column is
0610: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0620: 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69   table to.** whi
0630: 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c  ch the index bel
0640: 6f 6e 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73  ongs.  In each s
0650: 75 63 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61  uch row, the sta
0660: 74 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65  t column will be
0670: 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e  .** a string con
0680: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73  sisting of a lis
0690: 74 20 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20  t of integers.  
06a0: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
06b0: 72 20 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73  r in this.** lis
06c0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
06d0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
06e0: 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
06f0: 74 61 62 6c 65 2e 20 20 54 68 65 20 73 65 63 6f  table.  The seco
0700: 6e 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73  nd.** integer is
0710: 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75 6d   the average num
0720: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0730: 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
0740: 76 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 76  ve the same.** v
0750: 61 6c 75 65 20 69 6e 20 74 68 65 20 66 69 72 73  alue in the firs
0760: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
0770: 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68 69 72  index.  The thir
0780: 64 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  d integer is the
0790: 20 61 76 65 72 61 67 65 0a 2a 2a 20 6e 75 6d 62   average.** numb
07a0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
07b0: 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  e index that hav
07c0: 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
07d0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
07e0: 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2e 20 20  wo.** columns.  
07f0: 54 68 65 20 4e 2d 74 68 20 69 6e 74 65 67 65 72  The N-th integer
0800: 20 28 66 6f 72 20 4e 3e 31 29 20 69 73 20 74 68   (for N>1) is th
0810: 65 20 61 76 65 72 61 67 65 20 6e 75 6d 62 65 72  e average number
0820: 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 2a 2a 20   of rows in .** 
0830: 74 68 65 20 69 6e 64 65 78 20 77 68 69 63 68 20  the index which 
0840: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
0850: 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  lue for the firs
0860: 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e 73 2e 20 20  t N-1 columns.  
0870: 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63 6f 6c 75 6d  For.** a K-colum
0880: 6e 20 69 6e 64 65 78 2c 20 74 68 65 72 65 20 77  n index, there w
0890: 69 6c 6c 20 62 65 20 4b 2b 31 20 69 6e 74 65 67  ill be K+1 integ
08a0: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
08b0: 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a 2a 2a 20 74  column.  If.** t
08c0: 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
08d0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  ue, then the las
08e0: 74 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  t integer will b
08f0: 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  e 1..**.** The l
0900: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ist of integers 
0910: 69 6e 20 74 68 65 20 73 74 61 74 20 63 6f 6c 75  in the stat colu
0920: 6d 6e 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c  mn can optionall
0930: 79 20 62 65 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  y be followed.**
0940: 20 62 79 20 74 68 65 20 6b 65 79 77 6f 72 64 20   by the keyword 
0950: 22 75 6e 6f 72 64 65 72 65 64 22 2e 20 20 54 68  "unordered".  Th
0960: 65 20 22 75 6e 6f 72 64 65 72 65 64 22 20 6b 65  e "unordered" ke
0970: 79 77 6f 72 64 2c 20 69 66 20 69 74 20 69 73 20  yword, if it is 
0980: 70 72 65 73 65 6e 74 2c 0a 2a 2a 20 6d 75 73 74  present,.** must
0990: 20 62 65 20 73 65 70 61 72 61 74 65 64 20 66 72   be separated fr
09a0: 6f 6d 20 74 68 65 20 6c 61 73 74 20 69 6e 74 65  om the last inte
09b0: 67 65 72 20 62 79 20 61 20 73 69 6e 67 6c 65 20  ger by a single 
09c0: 73 70 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a  space.  If the.*
09d0: 2a 20 22 75 6e 6f 72 64 65 72 65 64 22 20 6b 65  * "unordered" ke
09e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
09f0: 2c 20 74 68 65 6e 20 74 68 65 20 71 75 65 72 79  , then the query
0a00: 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
0a10: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69 6e 64   that.** the ind
0a20: 65 78 20 69 73 20 75 6e 6f 72 64 65 72 65 64 20  ex is unordered 
0a30: 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65  and will not use
0a40: 20 74 68 65 20 69 6e 64 65 78 20 66 6f 72 20 61   the index for a
0a50: 20 72 61 6e 67 65 20 71 75 65 72 79 2e 0a 2a 2a   range query..**
0a60: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69   .** If the sqli
0a70: 74 65 5f 73 74 61 74 31 2e 69 64 78 20 63 6f 6c  te_stat1.idx col
0a80: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  umn is NULL, the
0a90: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0aa0: 74 31 2e 73 74 61 74 0a 2a 2a 20 63 6f 6c 75 6d  t1.stat.** colum
0ab0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  n contains a sin
0ac0: 67 6c 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  gle integer whic
0ad0: 68 20 69 73 20 74 68 65 20 28 65 73 74 69 6d 61  h is the (estima
0ae0: 74 65 64 29 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  ted) number of.*
0af0: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  * rows in the ta
0b00: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
0b10: 79 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 74  y sqlite_stat1.t
0b20: 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74  bl..**.** Format
0b30: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
0b40: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
0b50: 74 65 5f 73 74 61 74 32 20 69 73 20 6f 6e 6c 79  te_stat2 is only
0b60: 20 63 72 65 61 74 65 64 20 61 6e 64 20 69 73 20   created and is 
0b70: 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 53 51 4c  only used if SQL
0b80: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 0a  ite is compiled.
0b90: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45  ** with SQLITE_E
0ba0: 4e 41 42 4c 45 5f 53 54 41 54 32 20 61 6e 64 20  NABLE_STAT2 and 
0bb0: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  if the SQLite ve
0bc0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
0bd0: 62 65 74 77 65 65 6e 0a 2a 2a 20 33 2e 36 2e 31  between.** 3.6.1
0be0: 38 20 61 6e 64 20 33 2e 37 2e 37 2e 20 20 54 68  8 and 3.7.7.  Th
0bf0: 65 20 22 73 74 61 74 32 22 20 74 61 62 6c 65 20  e "stat2" table 
0c00: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
0c10: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  nal information.
0c20: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 64 69 73  ** about the dis
0c30: 74 72 69 62 75 74 69 6f 6e 20 6f 66 20 6b 65 79  tribution of key
0c40: 73 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 64 65  s within an inde
0c50: 78 2e 20 20 54 68 65 20 69 6e 64 65 78 20 69 73  x.  The index is
0c60: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
0c70: 2a 20 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75  * the "idx" colu
0c80: 6d 6e 20 61 6e 64 20 74 68 65 20 22 74 62 6c 22  mn and the "tbl"
0c90: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 6e   column is the n
0ca0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
0cb0: 20 74 6f 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   to which.** the
0cc0: 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 2e 20   index belongs. 
0cd0: 20 54 68 65 72 65 20 61 72 65 20 75 73 75 61 6c   There are usual
0ce0: 6c 79 20 31 30 20 72 6f 77 73 20 69 6e 20 74 68  ly 10 rows in th
0cf0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 0a 2a  e sqlite_stat2.*
0d00: 2a 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68  * table for each
0d10: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   index..**.** Th
0d20: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 65  e sqlite_stat2 e
0d30: 6e 74 69 72 65 73 20 66 6f 72 20 61 6e 20 69 6e  ntires for an in
0d40: 64 65 78 20 74 68 61 74 20 68 61 76 65 20 73 61  dex that have sa
0d50: 6d 70 6c 65 6e 6f 20 62 65 74 77 65 65 6e 20 30  mpleno between 0
0d60: 20 61 6e 64 20 39 0a 2a 2a 20 69 6e 63 6c 75 73   and 9.** inclus
0d70: 69 76 65 20 61 72 65 20 73 61 6d 70 6c 65 73 20  ive are samples 
0d80: 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
0d90: 20 6b 65 79 20 76 61 6c 75 65 20 69 6e 20 74 68   key value in th
0da0: 65 20 69 6e 64 65 78 20 74 61 6b 65 6e 20 61 74  e index taken at
0db0: 0a 2a 2a 20 65 76 65 6e 6c 79 20 73 70 61 63 65  .** evenly space
0dc0: 64 20 70 6f 69 6e 74 73 20 61 6c 6f 6e 67 20 74  d points along t
0dd0: 68 65 20 69 6e 64 65 78 2e 20 20 4c 65 74 20 74  he index.  Let t
0de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  he number of sam
0df0: 70 6c 65 73 20 62 65 20 53 0a 2a 2a 20 28 31 30  ples be S.** (10
0e00: 20 69 6e 20 74 68 65 20 73 74 61 6e 64 61 72 64   in the standard
0e10: 20 62 75 69 6c 64 29 20 61 6e 64 20 6c 65 74 20   build) and let 
0e20: 43 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  C be the number 
0e30: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
0e40: 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  ndex..** Then th
0e50: 65 20 73 61 6d 70 6c 65 64 20 72 6f 77 73 20 61  e sampled rows a
0e60: 72 65 20 67 69 76 65 6e 20 62 79 3a 0a 2a 2a 0a  re given by:.**.
0e70: 2a 2a 20 20 20 20 20 72 6f 77 6e 75 6d 62 65 72  **     rownumber
0e80: 20 3d 20 28 69 2a 43 2a 32 20 2b 20 43 29 2f 28   = (i*C*2 + C)/(
0e90: 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  S*2).**.** For i
0ea0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 53   between 0 and S
0eb0: 2d 31 2e 20 20 43 6f 6e 63 65 70 74 75 61 6c 6c  -1.  Conceptuall
0ec0: 79 2c 20 74 68 65 20 69 6e 64 65 78 20 73 70 61  y, the index spa
0ed0: 63 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ce is divided in
0ee0: 74 6f 0a 2a 2a 20 53 20 75 6e 69 66 6f 72 6d 20  to.** S uniform 
0ef0: 62 75 63 6b 65 74 73 20 61 6e 64 20 74 68 65 20  buckets and the 
0f00: 73 61 6d 70 6c 65 73 20 61 72 65 20 74 68 65 20  samples are the 
0f10: 6d 69 64 64 6c 65 20 72 6f 77 20 66 72 6f 6d 20  middle row from 
0f20: 65 61 63 68 20 62 75 63 6b 65 74 2e 0a 2a 2a 0a  each bucket..**.
0f30: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
0f40: 72 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69  r sqlite_stat2 i
0f50: 73 20 72 65 63 6f 72 64 65 64 20 68 65 72 65 20  s recorded here 
0f60: 66 6f 72 20 6c 65 67 61 63 79 20 72 65 66 65 72  for legacy refer
0f70: 65 6e 63 65 2e 20 20 54 68 69 73 0a 2a 2a 20 76  ence.  This.** v
0f80: 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ersion of SQLite
0f90: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
0fa0: 74 20 73 71 6c 69 74 65 5f 73 74 61 74 32 2e 20  t sqlite_stat2. 
0fb0: 20 49 74 20 6e 65 69 74 68 65 72 20 72 65 61 64   It neither read
0fc0: 73 20 6e 6f 72 0a 2a 2a 20 77 72 69 74 65 73 20  s nor.** writes 
0fd0: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  the sqlite_stat2
0fe0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 76 65   table.  This ve
0ff0: 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20  rsion of SQLite 
1000: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 0a 2a 2a  only supports.**
1010: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 0a 2a   sqlite_stat3..*
1020: 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20  *.** Format for 
1030: 73 71 6c 69 74 65 5f 73 74 61 74 33 3a 0a 2a 2a  sqlite_stat3:.**
1040: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1050: 74 61 74 33 20 69 73 20 61 6e 20 65 6e 68 61 6e  tat3 is an enhan
1060: 63 65 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  cement to sqlite
1070: 5f 73 74 61 74 32 2e 20 20 41 20 6e 65 77 20 6e  _stat2.  A new n
1080: 61 6d 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  ame is.** used t
1090: 6f 20 61 76 6f 69 64 20 63 6f 6d 70 61 74 69 62  o avoid compatib
10a0: 69 6c 69 74 79 20 70 72 6f 62 6c 65 6d 73 2e 20  ility problems. 
10b0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d   .**.** The form
10c0: 61 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  at of the sqlite
10d0: 5f 73 74 61 74 33 20 74 61 62 6c 65 20 69 73 20  _stat3 table is 
10e0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 66  similar to the f
10f0: 6f 72 6d 61 74 20 66 6f 72 0a 2a 2a 20 74 68 65  ormat for.** the
1100: 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74 61   sqlite_stat2 ta
1110: 62 6c 65 2c 20 77 69 74 68 20 74 68 65 20 66 6f  ble, with the fo
1120: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
1130: 20 20 28 31 29 0a 2a 2a 20 54 68 65 20 73 61 6d    (1).** The sam
1140: 70 6c 65 6e 6f 20 63 6f 6c 75 6d 6e 20 69 73 20  pleno column is 
1150: 72 65 6d 6f 76 65 64 2e 20 20 28 32 29 20 45 76  removed.  (2) Ev
1160: 65 72 79 20 73 61 6d 70 6c 65 20 68 61 73 20 6e  ery sample has n
1170: 45 71 20 61 6e 64 20 6e 4c 74 20 0a 2a 2a 20 63  Eq and nLt .** c
1180: 6f 6c 75 6d 6e 73 20 77 68 69 63 68 20 68 6f 6c  olumns which hol
1190: 64 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  d the approximat
11a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 73  e number of keys
11b0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
11c0: 61 74 0a 2a 2a 20 65 78 61 63 74 6c 79 20 6d 61  at.** exactly ma
11d0: 74 63 68 20 74 68 65 20 73 61 6d 70 6c 65 2c 20  tch the sample, 
11e0: 61 6e 64 20 77 68 69 63 68 20 61 72 65 20 6c 65  and which are le
11f0: 73 73 20 74 68 61 6e 20 74 68 65 20 73 61 6d 70  ss than the samp
1200: 6c 65 2c 0a 2a 2a 20 72 65 73 70 65 63 74 69 76  le,.** respectiv
1210: 65 6c 79 2e 20 20 28 33 29 20 54 68 65 20 6e 75  ely.  (3) The nu
1220: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
1230: 63 61 6e 20 76 65 72 79 20 66 72 6f 6d 20 6f 6e  can very from on
1240: 65 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 74 68  e table.** to th
1250: 65 20 6e 65 78 74 3b 20 74 68 65 20 73 61 6d 70  e next; the samp
1260: 6c 65 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  le count does no
1270: 74 20 68 61 76 65 20 74 6f 20 62 65 20 65 78 61  t have to be exa
1280: 63 74 6c 79 20 31 30 20 61 73 0a 2a 2a 20 69 74  ctly 10 as.** it
1290: 20 69 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f   is with sqlite_
12a0: 73 74 61 74 32 2e 20 28 34 29 20 54 68 65 20 73  stat2. (4) The s
12b0: 61 6d 70 6c 65 73 20 64 6f 20 6e 6f 74 20 68 61  amples do not ha
12c0: 76 65 20 74 6f 20 62 65 20 65 76 65 6e 6c 79 20  ve to be evenly 
12d0: 73 70 61 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  spaced..**.** Th
12e0: 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
12f0: 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79  d will typically
1300: 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74 65   generate sqlite
1310: 5f 73 74 61 74 33 20 74 61 62 6c 65 73 0a 2a 2a  _stat3 tables.**
1320: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62 65   that contain be
1330: 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30 20  tween 10 and 40 
1340: 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61 72  samples which ar
1350: 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61 63  e distributed ac
1360: 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79 20  ross.** the key 
1370: 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e 6f  space, though no
1380: 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e 64  t uniformly, and
1390: 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20 73   which include s
13a0: 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20 6c  amples with.** l
13b0: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
13c0: 6e 45 71 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23  nEq values..*/.#
13d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e0: 49 54 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c  IT_ANALYZE.#incl
13f0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
1400: 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
1410: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
1420: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
1430: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
1440: 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 77 72   table for.** wr
1450: 69 74 69 6e 67 20 77 69 74 68 20 63 75 72 73 6f  iting with curso
1460: 72 20 69 53 74 61 74 43 75 72 2e 20 49 66 20 74  r iStatCur. If t
1470: 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 62  he library was b
1480: 75 69 6c 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  uilt with the.**
1490: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14a0: 54 41 54 32 20 6d 61 63 72 6f 20 64 65 66 69 6e  TAT2 macro defin
14b0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 73 71 6c  ed, then the sql
14c0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
14d0: 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 66 6f 72  is.** opened for
14e0: 20 77 72 69 74 69 6e 67 20 75 73 69 6e 67 20 63   writing using c
14f0: 75 72 73 6f 72 20 28 69 53 74 61 74 43 75 72 2b  ursor (iStatCur+
1500: 31 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1).**.** If the 
1510: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
1520: 6c 65 73 20 64 6f 65 73 20 6e 6f 74 20 70 72 65  les does not pre
1530: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1540: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1550: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74   Similarly, if t
1560: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20  he sqlite_stat2 
1570: 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  table does not e
1580: 78 69 73 74 20 61 6e 64 20 74 68 65 20 6c 69 62  xist and the lib
1590: 72 61 72 79 0a 2a 2a 20 69 73 20 63 6f 6d 70 69  rary.** is compi
15a0: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
15b0: 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 64 65 66  ENABLE_STAT2 def
15c0: 69 6e 65 64 2c 20 69 74 20 69 73 20 63 72 65 61  ined, it is crea
15d0: 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 41 72 67 75  ted. .**.** Argu
15e0: 6d 65 6e 74 20 7a 57 68 65 72 65 20 6d 61 79 20  ment zWhere may 
15f0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
1600: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1610: 69 6e 67 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ing a table name
1620: 2c 0a 2a 2a 20 6f 72 20 69 74 20 6d 61 79 20 62  ,.** or it may b
1630: 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  e a NULL pointer
1640: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  . If it is not N
1650: 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 65 6e  ULL, then all en
1660: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  tries in.** the 
1670: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64  sqlite_stat1 and
1680: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
1690: 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74 61   sqlite_stat2 ta
16a0: 62 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  bles associated.
16b0: 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ** with the name
16c0: 64 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  d table are dele
16d0: 74 65 64 2e 20 49 66 20 7a 57 68 65 72 65 3d 3d  ted. If zWhere==
16e0: 30 2c 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  0, then code is 
16f0: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 74 6f 20  generated.** to 
1700: 64 65 6c 65 74 65 20 61 6c 6c 20 73 74 61 74 20  delete all stat 
1710: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 0a 2a  table entries..*
1720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70  /.static void op
1730: 65 6e 53 74 61 74 54 61 62 6c 65 28 0a 20 20 50  enStatTable(.  P
1740: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1750: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1760: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1770: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
1780: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1790: 74 61 62 61 73 65 20 77 65 20 61 72 65 20 6c 6f  tabase we are lo
17a0: 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a 20 20 69 6e  oking in */.  in
17b0: 74 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 20  t iStatCur,     
17c0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
17d0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
17e0: 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 63 75 72  able on this cur
17f0: 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sor */.  const c
1800: 68 61 72 20 2a 7a 57 68 65 72 65 2c 20 20 20 20  har *zWhere,    
1810: 20 2f 2a 20 44 65 6c 65 74 65 20 65 6e 74 72 69   /* Delete entri
1820: 65 73 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  es for this tabl
1830: 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
1850: 72 65 54 79 70 65 20 20 2f 2a 20 45 69 74 68 65  reType  /* Eithe
1860: 72 20 22 74 62 6c 22 20 6f 72 20 22 69 64 78 22  r "tbl" or "idx"
1870: 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
1880: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
1890: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18a0: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
18b0: 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 0a 20 20 7d  char *zCols;.  }
18c0: 20 61 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20   aTable[] = {.  
18d0: 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74 61 74    { "sqlite_stat
18e0: 31 22 2c 20 22 74 62 6c 2c 69 64 78 2c 73 74 61  1", "tbl,idx,sta
18f0: 74 22 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  t" },.#ifdef SQL
1900: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1910: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
1920: 74 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat3", "tbl,idx,
1930: 6e 65 71 2c 6e 6c 74 2c 73 61 6d 70 6c 65 22 20  neq,nlt,sample" 
1940: 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  },.#endif.  };. 
1950: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1960: 61 72 20 2a 61 7a 54 6f 44 72 6f 70 5b 5d 20 3d  ar *azToDrop[] =
1970: 20 7b 20 0a 20 20 20 20 22 73 71 6c 69 74 65 5f   { .    "sqlite_
1980: 73 74 61 74 32 22 2c 0a 23 69 66 6e 64 65 66 20  stat2",.#ifndef 
1990: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19a0: 41 54 33 0a 20 20 20 20 22 73 71 6c 69 74 65 5f  AT3.    "sqlite_
19b0: 73 74 61 74 33 22 2c 0a 23 65 6e 64 69 66 0a 20  stat3",.#endif. 
19c0: 20 7d 3b 0a 0a 20 20 69 6e 74 20 61 52 6f 6f 74   };..  int aRoot
19d0: 5b 5d 20 3d 20 7b 30 2c 20 30 7d 3b 0a 20 20 75  [] = {0, 0};.  u
19e0: 38 20 61 43 72 65 61 74 65 54 62 6c 5b 5d 20 3d  8 aCreateTbl[] =
19f0: 20 7b 30 2c 20 30 7d 3b 0a 0a 20 20 69 6e 74 20   {0, 0};..  int 
1a00: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
1a10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1a20: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
1a30: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1a40: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1a50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1a60: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
1a70: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1a80: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
1a90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1aa0: 33 56 64 62 65 44 62 28 76 29 3d 3d 64 62 20 29  3VdbeDb(v)==db )
1ab0: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
1ac0: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 44  Db[iDb];..  /* D
1ad0: 72 6f 70 20 61 6c 6c 20 73 74 61 74 69 73 74 69  rop all statisti
1ae0: 63 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  cs tables that t
1af0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  his version of S
1b00: 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 0a 20  QLite does not. 
1b10: 20 2a 2a 20 75 6e 64 65 72 73 74 61 6e 64 2e 0a   ** understand..
1b20: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1b30: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 54 6f  i<ArraySize(azTo
1b40: 44 72 6f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Drop); i++){.   
1b50: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
1b60: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1b70: 64 62 2c 20 61 7a 54 6f 44 72 6f 70 5b 69 5d 2c  db, azToDrop[i],
1b80: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
1b90: 20 20 69 66 28 20 70 54 61 62 20 29 20 73 71 6c    if( pTab ) sql
1ba0: 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
1bb0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1bc0: 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  iDb, 0);.  }..  
1bd0: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73 74  /* Create new st
1be0: 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20 69  atistic tables i
1bf0: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65 78  f they do not ex
1c00: 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74 68  ist, or clear th
1c10: 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20  em.  ** if they 
1c20: 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  do already exist
1c30: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1c40: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
1c50: 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  able); i++){.   
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1c70: 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e  b = aTable[i].zN
1c80: 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ame;.    Table *
1c90: 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20 28  pStat;.    if( (
1ca0: 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33 46  pStat = sqlite3F
1cb0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
1cc0: 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 3d  b, pDb->zName))=
1cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1ce0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  he sqlite_stat[1
1cf0: 32 5d 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  2] table does no
1d00: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
1d10: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
1d20: 0a 20 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65  .      ** side-e
1d30: 66 66 65 63 74 20 6f 66 20 74 68 65 20 43 52 45  ffect of the CRE
1d40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1d50: 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20  ent is to leave 
1d60: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20  the rootpage .  
1d70: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 65      ** of the ne
1d80: 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73  w table in regis
1d90: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
1da0: 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69 6d 70  oot. This is imp
1db0: 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20 2a 2a  ortant .      **
1dc0: 20 62 65 63 61 75 73 65 20 74 68 65 20 4f 70 65   because the Ope
1dd0: 6e 57 72 69 74 65 20 6f 70 63 6f 64 65 20 62 65  nWrite opcode be
1de0: 6c 6f 77 20 77 69 6c 6c 20 62 65 20 6e 65 65 64  low will be need
1df0: 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ing it. */.     
1e00: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1e10: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1e20: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
1e30: 42 4c 45 20 25 51 2e 25 73 28 25 73 29 22 2c 20  BLE %Q.%s(%s)", 
1e40: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62  pDb->zName, zTab
1e50: 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c  , aTable[i].zCol
1e60: 73 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  s.      );.     
1e70: 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61 72   aRoot[i] = pPar
1e80: 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20 20  se->regRoot;.   
1e90: 20 20 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d     aCreateTbl[i]
1ea0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1eb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61  .      /* The ta
1ec0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
1ed0: 74 73 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73  ts. If zWhere is
1ee0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74   not NULL, delet
1ef0: 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a 20  e all entries . 
1f00: 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74       ** associat
1f10: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1f20: 65 20 7a 57 68 65 72 65 2e 20 49 66 20 7a 57 68  e zWhere. If zWh
1f30: 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65 6c  ere is NULL, del
1f40: 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
1f50: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
1f60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 2a   of the table. *
1f70: 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 69 5d  /.      aRoot[i]
1f80: 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b 0a   = pStat->tnum;.
1f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
1fa0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
1fb0: 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c  Db, aRoot[i], 1,
1fc0: 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66   zTab);.      if
1fd0: 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( zWhere ){.    
1fe0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1ff0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
2000: 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
2010: 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
2020: 52 45 20 25 73 3d 25 51 22 2c 20 70 44 62 2d 3e  RE %s=%Q", pDb->
2030: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68  zName, zTab, zWh
2040: 65 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a  ereType, zWhere.
2050: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2070: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  /* The sqlite_st
2080: 61 74 5b 31 32 5d 20 74 61 62 6c 65 20 61 6c 72  at[12] table alr
2090: 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 44 65  eady exists.  De
20a0: 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e 20 2a  lete all rows. *
20b0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
20c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20d0: 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f 74 5b 69  P_Clear, aRoot[i
20e0: 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  ], iDb);.      }
20f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2100: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
2110: 5f 73 74 61 74 5b 31 33 5d 20 74 61 62 6c 65 73  _stat[13] tables
2120: 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2130: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
2140: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 3b  raySize(aTable);
2150: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
2160: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2170: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 53  OP_OpenWrite, iS
2180: 74 61 74 43 75 72 2b 69 2c 20 61 52 6f 6f 74 5b  tatCur+i, aRoot[
2190: 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  i], iDb);.    sq
21a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
21b0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
21c0: 29 33 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  )3, P4_INT32);. 
21d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21e0: 61 6e 67 65 50 35 28 76 2c 20 61 43 72 65 61 74  angeP5(v, aCreat
21f0: 65 54 62 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a  eTbl[i]);.  }.}.
2200: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64  ./*.** Recommend
2210: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  ed number of sam
2220: 70 6c 65 73 20 66 6f 72 20 73 71 6c 69 74 65 5f  ples for sqlite_
2230: 73 74 61 74 33 0a 2a 2f 0a 23 69 66 6e 64 65 66  stat3.*/.#ifndef
2240: 20 53 51 4c 49 54 45 5f 53 54 41 54 33 5f 53 41   SQLITE_STAT3_SA
2250: 4d 50 4c 45 53 0a 23 20 64 65 66 69 6e 65 20 53  MPLES.# define S
2260: 51 4c 49 54 45 5f 53 54 41 54 33 5f 53 41 4d 50  QLITE_STAT3_SAMP
2270: 4c 45 53 20 32 30 0a 23 65 6e 64 69 66 0a 0a 2f  LES 20.#endif../
2280: 2a 0a 2a 2a 20 54 68 72 65 65 20 53 51 4c 20 66  *.** Three SQL f
2290: 75 6e 63 74 69 6f 6e 73 20 2d 20 73 74 61 74 33  unctions - stat3
22a0: 5f 69 6e 69 74 28 29 2c 20 73 74 61 74 33 5f 70  _init(), stat3_p
22b0: 75 73 68 28 29 2c 20 61 6e 64 20 73 74 61 74 33  ush(), and stat3
22c0: 5f 70 6f 70 28 29 20 2d 0a 2a 2a 20 73 68 61 72  _pop() -.** shar
22d0: 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  e an instance of
22e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
22f0: 74 72 75 63 74 75 72 65 20 74 6f 20 68 6f 6c 64  tructure to hold
2300: 20 74 68 65 69 72 20 73 74 61 74 65 0a 2a 2a 20   their state.** 
2310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2320: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
2330: 74 61 74 33 41 63 63 75 6d 20 53 74 61 74 33 41  tat3Accum Stat3A
2340: 63 63 75 6d 3b 0a 73 74 72 75 63 74 20 53 74 61  ccum;.struct Sta
2350: 74 33 41 63 63 75 6d 20 7b 0a 20 20 74 52 6f 77  t3Accum {.  tRow
2360: 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  cnt nRow;       
2370: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2380: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
2390: 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ntire table */. 
23a0: 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d 70 6c   tRowcnt nPSampl
23b0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  e;         /* Ho
23c0: 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20 61 20  w often to do a 
23d0: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20  periodic sample 
23e0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 3b 20 20  */.  int iMin;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2400: 2a 20 49 6e 64 65 78 20 6f 66 20 65 6e 74 72 79  * Index of entry
2410: 20 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 6e 45   with minimum nE
2420: 71 20 61 6e 64 20 68 61 73 68 20 2a 2f 0a 20 20  q and hash */.  
2430: 69 6e 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20  int mxSample;   
2440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2450: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
2460: 61 6d 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75  amples to accumu
2470: 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  late */.  int nS
2480: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ample;          
2490: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
24a0: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
24b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 74 61   */.  struct Sta
24c0: 74 33 53 61 6d 70 6c 65 20 7b 0a 20 20 20 20 69  t3Sample {.    i
24d0: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
24e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
24f0: 69 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65  id in main table
2500: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
2510: 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 3b 20     tRowcnt nEq; 
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 6e 45   sqlite_stat3.nE
2540: 71 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74  q */.    tRowcnt
2550: 20 6e 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20   nLt;           
2560: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
2570: 61 74 33 2e 6e 4c 74 20 2a 2f 0a 20 20 20 20 75  at3.nLt */.    u
2580: 38 20 69 73 50 53 61 6d 70 6c 65 3b 20 20 20 20  8 isPSample;    
2590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25a0: 65 20 69 66 20 61 20 70 65 72 69 6f 64 69 63 20  e if a periodic 
25b0: 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 75 33  sample */.    u3
25c0: 32 20 69 48 61 73 68 3b 20 20 20 20 20 20 20 20  2 iHash;        
25d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62           /* Tieb
25e0: 72 65 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 20  reaker hash */. 
25f0: 20 7d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20   } *a;          
2600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2610: 20 61 72 72 61 79 20 6f 66 20 73 61 6d 70 6c 65   array of sample
2620: 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20  s */.};..#ifdef 
2630: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2640: 41 54 33 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  AT3./*.** Implem
2650: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2660: 73 74 61 74 33 5f 69 6e 69 74 28 43 2c 53 29 20  stat3_init(C,S) 
2670: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
2680: 68 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72  he two parameter
2690: 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 75 6d  s.** are the num
26a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
26b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
26c0: 78 20 28 43 29 20 61 6e 64 20 74 68 65 20 6e 75  x (C) and the nu
26d0: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 0a  mber of samples.
26e0: 2a 2a 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  ** to accumulate
26f0: 20 28 53 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   (S)..**.** This
2700: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
2710: 65 73 20 74 68 65 20 53 74 61 74 33 41 63 63 75  es the Stat3Accu
2720: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
2730: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2740: 20 69 73 20 74 68 65 20 53 74 61 74 33 41 63 63   is the Stat3Acc
2750: 75 6d 20 6f 62 6a 65 63 74 20 28 50 29 2e 0a 2a  um object (P)..*
2760: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
2770: 61 74 33 49 6e 69 74 28 0a 20 20 73 71 6c 69 74  at3Init(.  sqlit
2780: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2790: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
27a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
27b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61   **argv.){.  Sta
27c0: 74 33 41 63 63 75 6d 20 2a 70 3b 0a 20 20 74 52  t3Accum *p;.  tR
27d0: 6f 77 63 6e 74 20 6e 52 6f 77 3b 0a 20 20 69 6e  owcnt nRow;.  in
27e0: 74 20 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 69 6e  t mxSample;.  in
27f0: 74 20 6e 3b 0a 0a 20 20 6e 52 6f 77 20 3d 20 28  t n;..  nRow = (
2800: 74 52 6f 77 63 6e 74 29 73 71 6c 69 74 65 33 5f  tRowcnt)sqlite3_
2810: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
2820: 5b 30 5d 29 3b 0a 20 20 6d 78 53 61 6d 70 6c 65  [0]);.  mxSample
2830: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2840: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
2850: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20   n = sizeof(*p) 
2860: 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  + sizeof(p->a[0]
2870: 29 2a 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 70 20  )*mxSample;.  p 
2880: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2890: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  ( n );.  if( p==
28a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
28c0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
28d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
28e0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29 3b  memset(p, 0, n);
28f0: 0a 20 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63  .  p->a = (struc
2900: 74 20 53 74 61 74 33 53 61 6d 70 6c 65 2a 29 26  t Stat3Sample*)&
2910: 70 5b 31 5d 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20  p[1];.  p->nRow 
2920: 3d 20 6e 52 6f 77 3b 0a 20 20 70 2d 3e 6d 78 53  = nRow;.  p->mxS
2930: 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65  ample = mxSample
2940: 3b 0a 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65 20  ;.  p->nPSample 
2950: 3d 20 70 2d 3e 6e 52 6f 77 2f 36 20 2b 20 31 3b  = p->nRow/6 + 1;
2960: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
2970: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
2980: 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 73 71  p, sizeof(p), sq
2990: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 73  lite3_free);.}.s
29a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63  tatic const Func
29b0: 44 65 66 20 73 74 61 74 33 49 6e 69 74 46 75 6e  Def stat3InitFun
29c0: 63 64 65 66 20 3d 20 7b 0a 20 20 32 2c 20 20 20  cdef = {.  2,   
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45  nArg */.  SQLITE
29f0: 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 69  _UTF8,      /* i
2a00: 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20  PrefEnc */.  0, 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a20: 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  * flags */.  0, 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20  * pUserData */. 
2a50: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a60: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2a70: 20 73 74 61 74 33 49 6e 69 74 2c 20 20 20 20 20   stat3Init,     
2a80: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
2a90: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2aa0: 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20     /* xStep */. 
2ab0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ac0: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
2ad0: 2a 2f 0a 20 20 22 73 74 61 74 33 5f 69 6e 69 74  */.  "stat3_init
2ae0: 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ",     /* zName 
2af0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2b00: 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68 20         /* pHash 
2b10: 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2b20: 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74 72         /* pDestr
2b30: 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  uctor */.};.../*
2b40: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2b50: 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 33 5f  on of the stat3_
2b60: 70 75 73 68 28 6e 45 71 2c 6e 4c 74 2c 72 6f 77  push(nEq,nLt,row
2b70: 69 64 2c 50 29 20 53 51 4c 20 66 75 6e 63 74 69  id,P) SQL functi
2b80: 6f 6e 2e 20 20 54 68 65 0a 2a 2a 20 61 72 67 75  on.  The.** argu
2b90: 6d 65 6e 74 73 20 64 65 73 63 72 69 62 65 20 61  ments describe a
2ba0: 20 73 69 6e 67 6c 65 20 6b 65 79 20 69 6e 73 74   single key inst
2bb0: 61 6e 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ance.  This rout
2bc0: 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 0a 2a  ine makes the .*
2bd0: 2a 20 64 65 63 69 73 69 6f 6e 20 61 62 6f 75 74  * decision about
2be0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2bf0: 74 6f 20 72 65 74 61 69 6e 20 74 68 69 73 20 6b  to retain this k
2c00: 65 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ey for the sqlit
2c10: 65 5f 73 74 61 74 33 0a 2a 2a 20 74 61 62 6c 65  e_stat3.** table
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
2c30: 72 6e 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  rn value is NULL
2c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c50: 20 73 74 61 74 33 50 75 73 68 28 0a 20 20 73 71   stat3Push(.  sq
2c60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2c70: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
2c80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
2c90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
2ca0: 53 74 61 74 33 41 63 63 75 6d 20 2a 70 20 3d 20  Stat3Accum *p = 
2cb0: 28 53 74 61 74 33 41 63 63 75 6d 2a 29 73 71 6c  (Stat3Accum*)sql
2cc0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
2cd0: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 74 52 6f 77  argv[3]);.  tRow
2ce0: 63 6e 74 20 6e 45 71 20 3d 20 73 71 6c 69 74 65  cnt nEq = sqlite
2cf0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
2d00: 67 76 5b 30 5d 29 3b 0a 20 20 74 52 6f 77 63 6e  gv[0]);.  tRowcn
2d10: 74 20 6e 4c 74 20 3d 20 73 71 6c 69 74 65 33 5f  t nLt = sqlite3_
2d20: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
2d30: 5b 31 5d 29 3b 0a 20 20 69 36 34 20 72 6f 77 69  [1]);.  i64 rowi
2d40: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
2d50: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 32 5d 29  e_int64(argv[2])
2d60: 3b 0a 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65  ;.  u8 isPSample
2d70: 20 3d 20 30 3b 0a 20 20 75 38 20 64 6f 49 6e 73   = 0;.  u8 doIns
2d80: 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ert = 0;.  int i
2d90: 4d 69 6e 20 3d 20 70 2d 3e 69 4d 69 6e 3b 0a 20  Min = p->iMin;. 
2da0: 20 73 74 72 75 63 74 20 53 74 61 74 33 53 61 6d   struct Stat3Sam
2db0: 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 0a 20 20  ple *pSample;.  
2dc0: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 68 2c 20  int i;.  u32 h, 
2dd0: 68 31 2c 20 68 32 2c 20 68 33 3b 0a 20 20 69 66  h1, h2, h3;.  if
2de0: 28 20 6e 45 71 3d 3d 30 20 29 20 72 65 74 75 72  ( nEq==0 ) retur
2df0: 6e 3b 0a 0a 20 20 68 31 20 3d 20 28 75 6e 73 69  n;..  h1 = (unsi
2e00: 67 6e 65 64 29 28 72 6f 77 69 64 26 30 78 66 66  gned)(rowid&0xff
2e10: 66 66 29 3b 0a 20 20 68 32 20 3d 20 28 75 6e 73  ff);.  h2 = (uns
2e20: 69 67 6e 65 64 29 6e 45 71 3b 0a 20 20 68 33 20  igned)nEq;.  h3 
2e30: 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 6e 4c 74  = (unsigned)(nLt
2e40: 2b 31 29 3b 0a 20 20 68 20 3d 20 68 31 2a 68 32  +1);.  h = h1*h2
2e50: 2a 68 33 2a 30 78 31 30 30 31 30 30 30 31 3b 0a  *h3*0x10010001;.
2e60: 0a 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e  .  if( (nLt/p->n
2e70: 50 53 61 6d 70 6c 65 29 21 3d 28 28 6e 45 71 2b  PSample)!=((nEq+
2e80: 6e 4c 74 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  nLt)/p->nPSample
2e90: 29 20 29 7b 0a 20 20 20 20 64 6f 49 6e 73 65 72  ) ){.    doInser
2ea0: 74 20 3d 20 69 73 50 53 61 6d 70 6c 65 20 3d 20  t = isPSample = 
2eb0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
2ec0: 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53  ->nSample<p->mxS
2ed0: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 64 6f 49  ample ){.    doI
2ee0: 6e 73 65 72 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  nsert = 1;.  }el
2ef0: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3e  se{.    if( nEq>
2f00: 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 6e 45 71 20 7c  p->a[iMin].nEq |
2f10: 7c 20 28 6e 45 71 3d 3d 70 2d 3e 61 5b 69 4d 69  | (nEq==p->a[iMi
2f20: 6e 5d 2e 6e 45 71 20 26 26 20 68 3e 70 2d 3e 61  n].nEq && h>p->a
2f30: 5b 69 4d 69 6e 5d 2e 69 48 61 73 68 29 20 29 7b  [iMin].iHash) ){
2f40: 0a 20 20 20 20 20 20 64 6f 49 6e 73 65 72 74 20  .      doInsert 
2f50: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
2f60: 20 69 66 28 20 21 64 6f 49 6e 73 65 72 74 20 29   if( !doInsert )
2f70: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
2f80: 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e 6d 78  ->nSample==p->mx
2f90: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 70 53  Sample ){.    pS
2fa0: 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b 69 4d  ample = &p->a[iM
2fb0: 69 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in];.  }else{.  
2fc0: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
2fd0: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 5d 3b  a[p->nSample++];
2fe0: 0a 20 20 7d 0a 20 20 70 53 61 6d 70 6c 65 2d 3e  .  }.  pSample->
2ff0: 69 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  iRowid = rowid;.
3000: 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 20 3d    pSample->nEq =
3010: 20 6e 45 71 3b 0a 20 20 70 53 61 6d 70 6c 65 2d   nEq;.  pSample-
3020: 3e 6e 4c 74 20 3d 20 6e 4c 74 3b 0a 20 20 70 53  >nLt = nLt;.  pS
3030: 61 6d 70 6c 65 2d 3e 69 48 61 73 68 20 3d 20 68  ample->iHash = h
3040: 3b 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 69 73 50  ;.  pSample->isP
3050: 53 61 6d 70 6c 65 20 3d 20 69 73 50 53 61 6d 70  Sample = isPSamp
3060: 6c 65 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  le;..  /* Find t
3070: 68 65 20 6e 65 77 20 6d 69 6e 69 6d 75 6d 20 2a  he new minimum *
3080: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  /.  if( p->nSamp
3090: 6c 65 3d 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le==p->mxSample 
30a0: 29 7b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d  ){.    pSample =
30b0: 20 70 2d 3e 61 3b 0a 20 20 20 20 69 20 3d 20 30   p->a;.    i = 0
30c0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 61  ;.    while( pSa
30d0: 6d 70 6c 65 2d 3e 69 73 50 53 61 6d 70 6c 65 20  mple->isPSample 
30e0: 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
30f0: 20 20 20 20 70 53 61 6d 70 6c 65 2b 2b 3b 0a 20      pSample++;. 
3100: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
3110: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
3120: 20 7d 0a 20 20 20 20 6e 45 71 20 3d 20 70 53 61   }.    nEq = pSa
3130: 6d 70 6c 65 2d 3e 6e 45 71 3b 0a 20 20 20 20 68  mple->nEq;.    h
3140: 20 3d 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73   = pSample->iHas
3150: 68 3b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b  h;.    iMin = i;
3160: 0a 20 20 20 20 66 6f 72 28 69 2b 2b 2c 20 70 53  .    for(i++, pS
3170: 61 6d 70 6c 65 2b 2b 3b 20 69 3c 70 2d 3e 6e 53  ample++; i<p->nS
3180: 61 6d 70 6c 65 3b 20 69 2b 2b 2c 20 70 53 61 6d  ample; i++, pSam
3190: 70 6c 65 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ple++){.      if
31a0: 28 20 70 53 61 6d 70 6c 65 2d 3e 69 73 50 53 61  ( pSample->isPSa
31b0: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
31c0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 61 6d 70  .      if( pSamp
31d0: 6c 65 2d 3e 6e 45 71 3c 6e 45 71 0a 20 20 20 20  le->nEq<nEq.    
31e0: 20 20 20 7c 7c 20 28 70 53 61 6d 70 6c 65 2d 3e     || (pSample->
31f0: 6e 45 71 3d 3d 6e 45 71 20 26 26 20 70 53 61 6d  nEq==nEq && pSam
3200: 70 6c 65 2d 3e 69 48 61 73 68 3c 68 29 0a 20 20  ple->iHash<h).  
3210: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
3220: 4d 69 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Min = i;.       
3230: 20 6e 45 71 20 3d 20 70 53 61 6d 70 6c 65 2d 3e   nEq = pSample->
3240: 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  nEq;.        h =
3250: 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73 68 3b   pSample->iHash;
3260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3270: 20 20 20 70 2d 3e 69 4d 69 6e 20 3d 20 69 4d 69     p->iMin = iMi
3280: 6e 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  n;.  }.}.static 
3290: 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74  const FuncDef st
32a0: 61 74 33 50 75 73 68 46 75 6e 63 64 65 66 20 3d  at3PushFuncdef =
32b0: 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
32c0: 20 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a         /* nArg *
32d0: 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  /.  SQLITE_UTF8,
32e0: 20 20 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e        /* iPrefEn
32f0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
3300: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
3310: 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  s */.  0,       
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
3330: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3350: 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 33  pNext */.  stat3
3360: 50 75 73 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Push,        /* 
3370: 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xFunc */.  0,   
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3390: 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20  xStep */.  0,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b0: 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22  xFinalize */.  "
33c0: 73 74 61 74 33 5f 70 75 73 68 22 2c 20 20 20 20  stat3_push",    
33d0: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30   /* zName */.  0
33e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33f0: 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 30   /* pHash */.  0
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20   /* pDestructor 
3420: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  */.};../*.** Imp
3430: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3440: 68 65 20 73 74 61 74 33 5f 67 65 74 28 50 2c 4e  he stat3_get(P,N
3450: 2c 2e 2e 2e 29 20 53 51 4c 20 66 75 6e 63 74 69  ,...) SQL functi
3460: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
3470: 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  e is.** used to 
3480: 71 75 65 72 79 20 74 68 65 20 72 65 73 75 6c 74  query the result
3490: 73 2e 20 20 43 6f 6e 74 65 6e 74 20 69 73 20 72  s.  Content is r
34a0: 65 74 75 72 6e 65 64 20 66 6f 72 20 74 68 65 20  eturned for the 
34b0: 4e 74 68 20 73 71 6c 69 74 65 5f 73 74 61 74 33  Nth sqlite_stat3
34c0: 0a 2a 2a 20 72 6f 77 20 77 68 65 72 65 20 4e 20  .** row where N 
34d0: 69 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  is between 0 and
34e0: 20 53 2d 31 20 61 6e 64 20 53 20 69 73 20 74 68   S-1 and S is th
34f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
3500: 6c 65 73 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c  les.  The.** val
3510: 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65  ue returned depe
3520: 6e 64 73 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  nds on the numbe
3530: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a  r of arguments..
3540: 2a 2a 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 32 20  **.**   argc==2 
3550: 20 20 20 72 65 73 75 6c 74 3a 20 20 72 6f 77 69     result:  rowi
3560: 64 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 33 20 20  d.**   argc==3  
3570: 20 20 72 65 73 75 6c 74 3a 20 20 6e 45 71 0a 2a    result:  nEq.*
3580: 2a 20 20 20 61 72 67 63 3d 3d 34 20 20 20 20 72  *   argc==4    r
3590: 65 73 75 6c 74 3a 20 20 6e 4c 74 0a 2a 2f 0a 73  esult:  nLt.*/.s
35a0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 33  tatic void stat3
35b0: 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Get(.  sqlite3_c
35c0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
35d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
35e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35f0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  rgv.){.  int n =
3600: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3610: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 53  nt(argv[1]);.  S
3620: 74 61 74 33 41 63 63 75 6d 20 2a 70 20 3d 20 28  tat3Accum *p = (
3630: 53 74 61 74 33 41 63 63 75 6d 2a 29 73 71 6c 69  Stat3Accum*)sqli
3640: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
3650: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 61 73 73 65  rgv[0]);..  asse
3660: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3670: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 3d 6e 20  ( p->nSample<=n 
3680: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
3690: 63 68 28 20 61 72 67 63 20 29 7b 0a 20 20 20 20  ch( argc ){.    
36a0: 63 61 73 65 20 32 3a 20 73 71 6c 69 74 65 33 5f  case 2: sqlite3_
36b0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
36c0: 74 65 78 74 2c 20 70 2d 3e 61 5b 6e 5d 2e 69 52  text, p->a[n].iR
36d0: 6f 77 69 64 29 3b 20 62 72 65 61 6b 3b 0a 20 20  owid); break;.  
36e0: 20 20 63 61 73 65 20 33 3a 20 73 71 6c 69 74 65    case 3: sqlite
36f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
3700: 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b 6e 5d 2e  ontext, p->a[n].
3710: 6e 45 71 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nEq);    break;.
3720: 20 20 20 20 63 61 73 65 20 34 3a 20 73 71 6c 69      case 4: sqli
3730: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3740: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b 6e  (context, p->a[n
3750: 5d 2e 6e 4c 74 29 3b 20 20 20 20 62 72 65 61 6b  ].nLt);    break
3760: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
3770: 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74 61  onst FuncDef sta
3780: 74 33 47 65 74 46 75 6e 63 64 65 66 20 3d 20 7b  t3GetFuncdef = {
3790: 0a 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20  .  -1,          
37a0: 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a       /* nArg */.
37b0: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20    SQLITE_UTF8,  
37c0: 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e 63 20      /* iPrefEnc 
37d0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
37e0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
37f0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
3800: 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44         /* pUserD
3810: 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
3820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
3830: 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 33 47 65  ext */.  stat3Ge
3840: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46  t,         /* xF
3850: 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  unc */.  0,     
3860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
3870: 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  tep */.  0,     
3880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
3890: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
38a0: 61 74 33 5f 67 65 74 22 2c 20 20 20 20 20 2f 2a  at3_get",     /*
38b0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20   zName */.  0,  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38d0: 20 70 48 61 73 68 20 2a 2f 0a 20 20 30 20 20 20   pHash */.  0   
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38f0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a   pDestructor */.
3900: 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
3910: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3920: 20 2a 2f 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65   */...../*.** Ge
3930: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
3940: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
3950: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3960: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
3970: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a  a single table..
3980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
3990: 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a  nalyzeOneTable(.
39a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39b0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
39c0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
39d0: 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61  *pTab,     /* Ta
39e0: 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63 65  ble whose indice
39f0: 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61 6c  s are to be anal
3a00: 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
3a10: 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49 66  *pOnlyIdx, /* If
3a20: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79 20   not NULL, only 
3a30: 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e 65  analyze this one
3a40: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
3a50: 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a 20  iStatCur,    /* 
3a60: 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75 72  Index of VdbeCur
3a70: 73 6f 72 20 74 68 61 74 20 77 72 69 74 65 73 20  sor that writes 
3a80: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
3a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
3aa0: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 2f 2a 20  iMem         /* 
3ab0: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
3ac0: 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69 6e   locations begin
3ad0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
3ae0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3af0: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61  se->db;    /* Da
3b00: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
3b10: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
3b40: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
3b50: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
3b80: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  n index being an
3b90: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 56 64 62 65  alyzed */.  Vdbe
3ba0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
3bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3bc0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
3bd0: 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70 20 2a  being built up *
3be0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3c10: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 4f 66 4c   */.  int topOfL
3c20: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
3c30: 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66     /* The top of
3c40: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
3c50: 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20  nt endOfLoop;   
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3c70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
3c80: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72  op */.  int jZer
3c90: 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20  oRows = -1;     
3ca0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
3cb0: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
3cc0: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
3cd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
3d00: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
3d10: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  ng pTab */.  int
3d20: 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d   regTabname = iM
3d30: 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67  em++;     /* Reg
3d40: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
3d50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
3d60: 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20   int regIdxname 
3d70: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a  = iMem++;     /*
3d80: 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   Register contai
3d90: 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20  ning index name 
3da0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74  */.  int regStat
3db0: 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  1 = iMem++;     
3dc0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 20 63 6f    /* The stat co
3dd0: 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74 65 5f 73  lumn of sqlite_s
3de0: 74 61 74 31 20 2a 2f 0a 23 69 66 64 65 66 20 53  tat1 */.#ifdef S
3df0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
3e00: 54 33 0a 20 20 69 6e 74 20 72 65 67 4e 75 6d 45  T3.  int regNumE
3e10: 71 20 3d 20 72 65 67 53 74 61 74 31 3b 20 20 20  q = regStat1;   
3e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
3e30: 6e 73 74 61 6e 63 65 73 2e 20 20 53 61 6d 65 20  nstances.  Same 
3e40: 61 73 20 72 65 67 53 74 61 74 31 20 2a 2f 0a 20  as regStat1 */. 
3e50: 20 69 6e 74 20 72 65 67 4e 75 6d 4c 74 20 3d 20   int regNumLt = 
3e60: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a  iMem++;       /*
3e70: 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 73 20   Number of keys 
3e80: 6c 65 73 73 20 74 68 61 6e 20 72 65 67 53 61 6d  less than regSam
3e90: 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ple */.  int reg
3ea0: 53 61 6d 70 6c 65 20 3d 20 69 4d 65 6d 2b 2b 3b  Sample = iMem++;
3eb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
3ec0: 74 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 20 2a  t sample value *
3ed0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
3ee0: 20 3d 20 72 65 67 53 61 6d 70 6c 65 3b 20 20 20   = regSample;   
3ef0: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 61 20 73   /* Rowid of a s
3f00: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  ample */.  int r
3f10: 65 67 41 63 63 75 6d 20 3d 20 69 4d 65 6d 2b 2b  egAccum = iMem++
3f20: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
3f30: 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74 61 74  ter to hold Stat
3f40: 33 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f  3Accum object */
3f50: 0a 20 20 69 6e 74 20 72 65 67 4c 6f 6f 70 20 3d  .  int regLoop =
3f60: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
3f70: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
3f80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 6f 75 6e  */.  int regCoun
3f90: 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  t = iMem++;     
3fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
3fb0: 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
3fc0: 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   or index */.  i
3fd0: 6e 74 20 72 65 67 54 65 6d 70 31 20 3d 20 69 4d  nt regTemp1 = iM
3fe0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 49  em++;       /* I
3ff0: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 67 69  ntermediate regi
4000: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
4010: 67 54 65 6d 70 32 20 3d 20 69 4d 65 6d 2b 2b 3b  gTemp2 = iMem++;
4020: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 6d         /* Interm
4030: 65 64 69 61 74 65 20 72 65 67 69 73 74 65 72 20  ediate register 
4040: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  */.  int once = 
4050: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
4060: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 69 6e    /* One-time in
4070: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
4080: 20 20 69 6e 74 20 73 68 6f 72 74 4a 75 6d 70 20    int shortJump 
4090: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
40a0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  * Instruction ad
40b0: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 69  dress */.  int i
40c0: 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d  TabCur = pParse-
40d0: 3e 6e 54 61 62 2b 2b 3b 20 2f 2a 20 54 61 62 6c  >nTab++; /* Tabl
40e0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 23 65 6e 64  e cursor */.#end
40f0: 69 66 0a 20 20 69 6e 74 20 72 65 67 43 6f 6c 20  if.  int regCol 
4100: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
4110: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
4120: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 61 6c  a column in anal
4130: 79 7a 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  yzed table */.  
4140: 69 6e 74 20 72 65 67 52 65 63 20 3d 20 69 4d 65  int regRec = iMe
4150: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  m++;         /* 
4160: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4170: 20 63 6f 6d 70 6c 65 74 65 64 20 72 65 63 6f 72   completed recor
4180: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 65  d */.  int regTe
4190: 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  mp = iMem++;    
41a0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
41b0: 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
41c0: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 52 6f 77  .  int regNewRow
41d0: 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  id = iMem++;    
41e0: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65  /* Rowid for the
41f0: 20 69 6e 73 65 72 74 65 64 20 72 65 63 6f 72 64   inserted record
4200: 20 2a 2f 0a 0a 0a 20 20 76 20 3d 20 73 71 6c 69   */...  v = sqli
4210: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
4220: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  e);.  if( v==0 |
4230: 7c 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  | NEVER(pTab==0)
4240: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4250: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
4260: 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  tnum==0 ){.    /
4270: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
4280: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69  statistics on vi
4290: 65 77 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ews or virtual t
42a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  ables */.    ret
42b0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  urn;.  }.  if( m
42c0: 65 6d 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  emcmp(pTab->zNam
42d0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
42e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ==0 ){.    /* Do
42f0: 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61 74   not gather stat
4300: 69 73 74 69 63 73 20 6f 6e 20 73 79 73 74 65 6d  istics on system
4310: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72   tables */.    r
4320: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4330: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
4340: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
4350: 28 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20  (db) );.  iDb = 
4360: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
4370: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
4380: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
4390: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 61  t( iDb>=0 );.  a
43a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
43b0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
43c0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 23 69 66  , iDb, 0) );.#if
43d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
43e0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
43f0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4400: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
4410: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54  LITE_ANALYZE, pT
4420: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ab->zName, 0,.  
4430: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
4440: 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
4450: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
4460: 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69  if..  /* Establi
4470: 73 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  sh a read-lock o
4480: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 74  n the table at t
4490: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
44a0: 6c 65 76 65 6c 2e 20 2a 2f 0a 20 20 73 71 6c 69  level. */.  sqli
44b0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
44c0: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
44d0: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
44e0: 4e 61 6d 65 29 3b 0a 0a 20 20 69 49 64 78 43 75  Name);..  iIdxCu
44f0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
4500: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
4510: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
4520: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54 61 62  ring8, 0, regTab
4530: 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  name, 0, pTab->z
4540: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28  Name, 0);.  for(
4550: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
4560: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
4570: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
4580: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 4b 65  int nCol;.    Ke
4590: 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 20  yInfo *pKey;.   
45a0: 20 69 6e 74 20 61 64 64 72 49 66 4e 6f 74 3b 20   int addrIfNot; 
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45c0: 20 61 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49   address of OP_I
45d0: 66 4e 6f 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fNot */.    int 
45e0: 2a 61 43 68 6e 67 41 64 64 72 3b 20 20 20 20 20  *aChngAddr;     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4600: 79 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75  y of jump instru
4610: 63 74 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20  ction addresses 
4620: 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f 6e 6c  */..    if( pOnl
4630: 79 49 64 78 20 26 26 20 70 4f 6e 6c 79 49 64 78  yIdx && pOnlyIdx
4640: 21 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  !=pIdx ) continu
4650: 65 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e;.    VdbeNoopC
4660: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
4670: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 25 73  n analysis of %s
4680: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
4690: 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64  ;.    nCol = pId
46a0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
46b0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
46c0: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
46d0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66  e, pIdx);.    if
46e0: 28 20 69 4d 65 6d 2b 31 2b 28 6e 43 6f 6c 2a 32  ( iMem+1+(nCol*2
46f0: 29 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  )>pParse->nMem )
4700: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
4710: 6e 4d 65 6d 20 3d 20 69 4d 65 6d 2b 31 2b 28 6e  nMem = iMem+1+(n
4720: 43 6f 6c 2a 32 29 3b 0a 20 20 20 20 7d 0a 20 20  Col*2);.    }.  
4730: 20 20 61 43 68 6e 67 41 64 64 72 20 3d 20 73 71    aChngAddr = sq
4740: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4750: 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
4760: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
4770: 0a 20 20 20 20 69 66 28 20 61 43 68 6e 67 41 64  .    if( aChngAd
4780: 64 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dr==0 ) continue
4790: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  ;..    /* Open a
47a0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 69   cursor to the i
47b0: 6e 64 65 78 20 74 6f 20 62 65 20 61 6e 61 6c 79  ndex to be analy
47c0: 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  zed. */.    asse
47d0: 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74 65 33  rt( iDb==sqlite3
47e0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
47f0: 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29  , pIdx->pSchema)
4800: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
4810: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
4820: 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
4830: 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  r, pIdx->tnum, i
4840: 44 62 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61  Db,.        (cha
4850: 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
4860: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
4870: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
4880: 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
4890: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
48a0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 72 65 67  Populate the reg
48b0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
48c0: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 2e   the index name.
48d0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
48e0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
48f0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 49  String8, 0, regI
4900: 64 78 6e 61 6d 65 2c 20 30 2c 20 70 49 64 78 2d  dxname, 0, pIdx-
4910: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 23 69 66  >zName, 0);..#if
4920: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4930: 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
4940: 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 6f 6e  once ){.      on
4950: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ce = 0;.      sq
4960: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
4970: 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20  Parse, iTabCur, 
4980: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
4990: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 7d 0a 20  enRead);.    }. 
49a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
49c0: 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 43 6f  , iIdxCur, regCo
49d0: 75 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  unt);.    sqlite
49e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
49f0: 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54  P_Integer, SQLIT
4a00: 45 5f 53 54 41 54 33 5f 53 41 4d 50 4c 45 53 2c  E_STAT3_SAMPLES,
4a10: 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20 20 20   regTemp1);.    
4a20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a30: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
4a40: 20 30 2c 20 72 65 67 4e 75 6d 45 71 29 3b 0a 20   0, regNumEq);. 
4a50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a60: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
4a70: 65 72 2c 20 30 2c 20 72 65 67 4e 75 6d 4c 74 29  er, 0, regNumLt)
4a80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4a90: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
4aa0: 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 43 6f  nction, 1, regCo
4ab0: 75 6e 74 2c 20 72 65 67 41 63 63 75 6d 2c 0a 20  unt, regAccum,. 
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61       (char*)&sta
4ae0: 74 33 49 6e 69 74 46 75 6e 63 64 65 66 2c 20 50  t3InitFuncdef, P
4af0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
4b00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4b10: 65 50 35 28 76 2c 20 32 29 3b 0a 23 65 6e 64 69  eP5(v, 2);.#endi
4b20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
4b30: 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20  LE_STAT3 */..   
4b40: 20 2f 2a 20 54 68 65 20 62 6c 6f 63 6b 20 6f 66   /* The block of
4b50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e   memory cells in
4b60: 69 74 69 61 6c 69 7a 65 64 20 68 65 72 65 20 69  itialized here i
4b70: 73 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  s used as follow
4b80: 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
4b90: 20 20 20 20 69 4d 65 6d 3a 20 20 20 20 20 20 20      iMem:       
4ba0: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2a 2a           .    **
4bb0: 20 20 20 20 20 20 20 20 54 68 65 20 74 6f 74 61          The tota
4bc0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
4bd0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
4be0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
4bf0: 69 4d 65 6d 2b 31 20 2e 2e 20 69 4d 65 6d 2b 6e  iMem+1 .. iMem+n
4c00: 43 6f 6c 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  Col: .    **    
4c10: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64 69      Number of di
4c20: 73 74 69 6e 63 74 20 65 6e 74 72 69 65 73 20 69  stinct entries i
4c30: 6e 20 69 6e 64 65 78 20 63 6f 6e 73 69 64 65 72  n index consider
4c40: 69 6e 67 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ing the .    ** 
4c50: 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
4c60: 20 4e 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 2c   N columns only,
4c70: 20 77 68 65 72 65 20 4e 20 69 73 20 62 65 74 77   where N is betw
4c80: 65 65 6e 20 31 20 61 6e 64 20 6e 43 6f 6c 2c 20  een 1 and nCol, 
4c90: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 69  .    **        i
4ca0: 6e 63 6c 75 73 69 76 65 2e 0a 20 20 20 20 2a 2a  nclusive..    **
4cb0: 0a 20 20 20 20 2a 2a 20 20 20 20 69 4d 65 6d 2b  .    **    iMem+
4cc0: 6e 43 6f 6c 2b 31 20 2e 2e 20 4d 65 6d 2b 32 2a  nCol+1 .. Mem+2*
4cd0: 6e 43 6f 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20  nCol:  .    **  
4ce0: 20 20 20 20 20 20 50 72 65 76 69 6f 75 73 20 76        Previous v
4cf0: 61 6c 75 65 20 6f 66 20 69 6e 64 65 78 65 64 20  alue of indexed 
4d00: 63 6f 6c 75 6d 6e 73 2c 20 66 72 6f 6d 20 6c 65  columns, from le
4d10: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20 20  ft to right..   
4d20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 65 6c 6c 73   **.    ** Cells
4d30: 20 69 4d 65 6d 20 74 68 72 6f 75 67 68 20 69 4d   iMem through iM
4d40: 65 6d 2b 6e 43 6f 6c 20 61 72 65 20 69 6e 69 74  em+nCol are init
4d50: 69 61 6c 69 7a 65 64 20 74 6f 20 30 2e 20 54 68  ialized to 0. Th
4d60: 65 20 6f 74 68 65 72 73 20 61 72 65 20 0a 20 20  e others are .  
4d70: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
4d80: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 53   to contain an S
4d90: 51 4c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  QL NULL..    */.
4da0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
4db0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4dc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4dd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
4de0: 72 2c 20 30 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20  r, 0, iMem+i);. 
4df0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4e00: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
4e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
4e30: 6c 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c  ll, 0, iMem+nCol
4e40: 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  +i+1);.    }..  
4e50: 20 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 61    /* Start the a
4e60: 6e 61 6c 79 73 69 73 20 6c 6f 6f 70 2e 20 54 68  nalysis loop. Th
4e70: 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 74 68 72  is loop runs thr
4e80: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65 6e 74  ough all the ent
4e90: 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 74  ries in.    ** t
4ea0: 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  he index b-tree.
4eb0: 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66 4c 6f    */.    endOfLo
4ec0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
4ed0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4ee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ef0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
4f00: 2c 20 69 49 64 78 43 75 72 2c 20 65 6e 64 4f 66  , iIdxCur, endOf
4f10: 4c 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70 4f 66  Loop);.    topOf
4f20: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
4f30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
4f60: 64 49 6d 6d 2c 20 69 4d 65 6d 2c 20 31 29 3b 20  dImm, iMem, 1); 
4f70: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f   /* Increment ro
4f80: 77 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  w counter */..  
4f90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4fa0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; i++){.      C
4fb0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
4fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fd0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
4fe0: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
4ff0: 20 72 65 67 43 6f 6c 29 3b 0a 20 20 20 20 20 20   regCol);.      
5000: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
5010: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 72 65      /* Always re
5020: 63 6f 72 64 20 74 68 65 20 76 65 72 79 20 66 69  cord the very fi
5030: 72 73 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  rst row */.     
5040: 20 20 20 61 64 64 72 49 66 4e 6f 74 20 3d 20 73     addrIfNot = s
5050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5060: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4d  (v, OP_IfNot, iM
5070: 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  em+1);.      }. 
5080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
5090: 78 2d 3e 61 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  x->azColl!=0 );.
50a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
50b0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 21 3d 30  dx->azColl[i]!=0
50c0: 20 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   );.      pColl 
50d0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
50e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
50f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b  Idx->azColl[i]);
5100: 0a 20 20 20 20 20 20 61 43 68 6e 67 41 64 64 72  .      aChngAddr
5110: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [i] = sqlite3Vdb
5120: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
5130: 2c 20 72 65 67 43 6f 6c 2c 20 30 2c 20 69 4d 65  , regCol, 0, iMe
5140: 6d 2b 6e 43 6f 6c 2b 69 2b 31 2c 0a 20 20 20 20  m+nCol+i+1,.    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 28 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20    (char*)pColl, 
5180: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
5190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
51a0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
51b0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
51c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
51d0: 22 6a 75 6d 70 20 69 66 20 63 6f 6c 75 6d 6e 20  "jump if column 
51e0: 25 64 20 63 68 61 6e 67 65 64 22 2c 20 69 29 29  %d changed", i))
51f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
5200: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
5210: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
5220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5230: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
5240: 64 64 49 6d 6d 2c 20 72 65 67 4e 75 6d 45 71 2c  ddImm, regNumEq,
5250: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
5260: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
5270: 63 72 20 72 65 70 65 61 74 20 63 6f 75 6e 74 22  cr repeat count"
5280: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ));.      }.#end
5290: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  if.    }.    sql
52a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
52b0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
52c0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 66 6f  dOfLoop);.    fo
52d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
52e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
52f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5300: 2c 20 61 43 68 6e 67 41 64 64 72 5b 69 5d 29 3b  , aChngAddr[i]);
5310: 20 20 2f 2a 20 53 65 74 20 6a 75 6d 70 20 64 65    /* Set jump de
5320: 73 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 4e 65  st for the OP_Ne
5330: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d   */.      if( i=
5340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5350: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5360: 65 28 76 2c 20 61 64 64 72 49 66 4e 6f 74 29 3b  e(v, addrIfNot);
5370: 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 20     /* Jump dest 
5380: 66 6f 72 20 4f 50 5f 49 66 4e 6f 74 20 2a 2f 0a  for OP_IfNot */.
5390: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
53a0: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20  ABLE_STAT3.     
53b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
53c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
53d0: 69 6f 6e 2c 20 31 2c 20 72 65 67 4e 75 6d 45 71  ion, 1, regNumEq
53e0: 2c 20 72 65 67 54 65 6d 70 32 2c 0a 20 20 20 20  , regTemp2,.    
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74        (char*)&st
5410: 61 74 33 50 75 73 68 46 75 6e 63 64 65 66 2c 20  at3PushFuncdef, 
5420: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
5430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5440: 43 68 61 6e 67 65 50 35 28 76 2c 20 34 29 3b 0a  ChangeP5(v, 4);.
5450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5460: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5470: 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
5480: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20   pIdx->nColumn, 
5490: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
54a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
54b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
54c0: 72 65 67 4e 75 6d 45 71 2c 20 72 65 67 4e 75 6d  regNumEq, regNum
54d0: 4c 74 2c 20 72 65 67 4e 75 6d 4c 74 29 3b 0a 20  Lt, regNumLt);. 
54e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5500: 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 4e 75  nteger, 1, regNu
5510: 6d 45 71 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  mEq);.#endif    
5520: 20 20 20 20 0a 20 20 20 20 20 20 7d 0a 20 20 20      .      }.   
5530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5540: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
5550: 6d 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 31 29 3b  m, iMem+i+1, 1);
5560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5570: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5580: 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
5590: 69 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31  i, iMem+nCol+i+1
55a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
55b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
55c0: 43 68 6e 67 41 64 64 72 29 3b 0a 0a 20 20 20 20  ChngAddr);..    
55d0: 2f 2a 20 41 6c 77 61 79 73 20 6a 75 6d 70 20 68  /* Always jump h
55e0: 65 72 65 20 61 66 74 65 72 20 75 70 64 61 74 69  ere after updati
55f0: 6e 67 20 74 68 65 20 69 4d 65 6d 2b 31 2e 2e 2e  ng the iMem+1...
5600: 69 4d 65 6d 2b 31 2b 6e 43 6f 6c 20 63 6f 75 6e  iMem+1+nCol coun
5610: 74 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ters */.    sqli
5620: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5630: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
5640: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
5650: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5660: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 74  Next, iIdxCur, t
5670: 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73  opOfLoop);.    s
5680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5690: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
56a0: 64 78 43 75 72 29 3b 0a 23 69 66 64 65 66 20 53  dxCur);.#ifdef S
56b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
56c0: 54 33 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T3.    sqlite3Vd
56d0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
56e0: 75 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 4e  unction, 1, regN
56f0: 75 6d 45 71 2c 20 72 65 67 54 65 6d 70 32 2c 0a  umEq, regTemp2,.
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74        (char*)&st
5720: 61 74 33 50 75 73 68 46 75 6e 63 64 65 66 2c 20  at3PushFuncdef, 
5730: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
5740: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5750: 67 65 50 35 28 76 2c 20 34 29 3b 0a 20 20 20 20  geP5(v, 4);.    
5760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5770: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
5780: 20 2d 31 2c 20 72 65 67 4c 6f 6f 70 29 3b 0a 20   -1, regLoop);. 
5790: 20 20 20 73 68 6f 72 74 4a 75 6d 70 20 3d 20 0a     shortJump = .
57a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
57b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
57c0: 6d 6d 2c 20 72 65 67 4c 6f 6f 70 2c 20 31 29 3b  mm, regLoop, 1);
57d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
57e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
57f0: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 41 63 63  ction, 1, regAcc
5800: 75 6d 2c 20 72 65 67 54 65 6d 70 31 2c 0a 20 20  um, regTemp1,.  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
5830: 33 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f  3GetFuncdef, P4_
5840: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
5850: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5860: 35 28 76 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  5(v, 2);.    sql
5870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5880: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
5890: 54 65 6d 70 31 29 3b 0a 20 20 20 20 73 71 6c 69  Temp1);.    sqli
58a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
58b0: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
58c0: 54 61 62 43 75 72 2c 20 73 68 6f 72 74 4a 75 6d  TabCur, shortJum
58d0: 70 2c 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20  p, regTemp1);.  
58e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
5900: 2c 20 69 54 61 62 43 75 72 2c 20 70 49 64 78 2d  , iTabCur, pIdx-
5910: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65  >aiColumn[0], re
5920: 67 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 73 71  gSample);.    sq
5930: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
5940: 6c 74 28 76 2c 20 70 54 61 62 2c 20 70 49 64 78  lt(v, pTab, pIdx
5950: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72  ->aiColumn[0], r
5960: 65 67 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 73  egSample);.    s
5970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5980: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
5990: 20 31 2c 20 72 65 67 41 63 63 75 6d 2c 20 72 65   1, regAccum, re
59a0: 67 4e 75 6d 45 71 2c 0a 20 20 20 20 20 20 20 20  gNumEq,.        
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
59c0: 68 61 72 2a 29 26 73 74 61 74 33 47 65 74 46 75  har*)&stat3GetFu
59d0: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
59e0: 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
59f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 33  dbeChangeP5(v, 3
5a00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5a10: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
5a20: 75 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 41  unction, 1, regA
5a30: 63 63 75 6d 2c 20 72 65 67 4e 75 6d 4c 74 2c 0a  ccum, regNumLt,.
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74        (char*)&st
5a60: 61 74 33 47 65 74 46 75 6e 63 64 65 66 2c 20 50  at3GetFuncdef, P
5a70: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
5a80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5a90: 65 50 35 28 76 2c 20 34 29 3b 0a 20 20 20 20 73  eP5(v, 4);.    s
5aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5ab0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5ac0: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 35  d, regTabname, 5
5ad0: 2c 20 72 65 67 52 65 63 2c 20 22 62 62 62 62 62  , regRec, "bbbbb
5ae0: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
5af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5b00: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74  OP_NewRowid, iSt
5b10: 61 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77 52  atCur+1, regNewR
5b20: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
5b30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5b40: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74  OP_Insert, iStat
5b50: 43 75 72 2b 31 2c 20 72 65 67 52 65 63 2c 20 72  Cur+1, regRec, r
5b60: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
5b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b80: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
5b90: 2c 20 73 68 6f 72 74 4a 75 6d 70 29 3b 0a 20 20  , shortJump);.  
5ba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
5bb0: 70 48 65 72 65 28 76 2c 20 73 68 6f 72 74 4a 75  pHere(v, shortJu
5bc0: 6d 70 2b 32 29 3b 0a 23 65 6e 64 69 66 20 20 20  mp+2);.#endif   
5bd0: 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 53 74       ..    /* St
5be0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
5bf0: 69 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e  in sqlite_stat1.
5c00: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
5c10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
5c20: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
5c30: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
5c40: 62 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a  ble.  The first.
5c50: 20 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d      ** two colum
5c60: 6e 73 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ns are the names
5c70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
5c80: 64 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68  d index.  The th
5c90: 69 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  ird column.    *
5ca0: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f  * is a string co
5cb0: 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74  mposed of a list
5cc0: 20 6f 66 20 69 6e 74 65 67 65 72 20 73 74 61 74   of integer stat
5cd0: 69 73 74 69 63 73 20 61 62 6f 75 74 20 74 68 65  istics about the
5ce0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
5cf0: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
5d00: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  r in the list is
5d10: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
5d20: 72 20 6f 66 20 65 6e 74 72 69 65 73 0a 20 20 20  r of entries.   
5d30: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
5d40: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
5d50: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
5d60: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 66  er in the list f
5d70: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 63  or each.    ** c
5d80: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
5d90: 6c 65 2e 20 20 54 68 69 73 20 61 64 64 69 74 69  le.  This additi
5da0: 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20  onal integer is 
5db0: 61 20 67 75 65 73 73 20 6f 66 20 68 6f 77 20 6d  a guess of how m
5dc0: 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20  any.    ** rows 
5dd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  of the table the
5de0: 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 65 6c 65   index will sele
5df0: 63 74 2e 20 20 49 66 20 44 20 69 73 20 74 68 65  ct.  If D is the
5e00: 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e   count of distin
5e10: 63 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  ct.    ** values
5e20: 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f   and K is the to
5e30: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
5e40: 77 73 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74  ws, then the int
5e50: 65 67 65 72 20 69 73 20 63 6f 6d 70 75 74 65 64  eger is computed
5e60: 0a 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20  .    ** as:.    
5e70: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
5e80: 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20   I = (K+D-1)/D. 
5e90: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
5ea0: 4b 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65 6e 74  K==0 then no ent
5eb0: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ry is made into 
5ec0: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
5ed0: 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2a   table.  .    **
5ee0: 20 49 66 20 4b 3e 30 20 74 68 65 6e 20 69 74 20   If K>0 then it 
5ef0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
5f00: 73 65 20 74 68 65 20 44 3e 30 20 73 6f 20 64 69  se the D>0 so di
5f10: 76 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 0a 20  vision by zero. 
5f20: 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 70     ** is never p
5f30: 6f 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ossible..    */.
5f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
5f60: 79 2c 20 69 4d 65 6d 2c 20 72 65 67 53 74 61 74  y, iMem, regStat
5f70: 31 29 3b 0a 20 20 20 20 69 66 28 20 6a 5a 65 72  1);.    if( jZer
5f80: 6f 52 6f 77 73 3c 30 20 29 7b 0a 20 20 20 20 20  oRows<0 ){.     
5f90: 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c   jZeroRows = sql
5fa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5fb0: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4d 65 6d  , OP_IfNot, iMem
5fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
5fd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
5fe0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
5ff0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
6000: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
6010: 67 54 65 6d 70 2c 20 30 2c 20 22 20 22 2c 20 30  gTemp, 0, " ", 0
6020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6030: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6040: 5f 43 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d 70  _Concat, regTemp
6050: 2c 20 72 65 67 53 74 61 74 31 2c 20 72 65 67 53  , regStat1, regS
6060: 74 61 74 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  tat1);.      sql
6070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6080: 2c 20 4f 50 5f 41 64 64 2c 20 69 4d 65 6d 2c 20  , OP_Add, iMem, 
6090: 69 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d  iMem+i+1, regTem
60a0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
60b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60c0: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 54 65 6d  P_AddImm, regTem
60d0: 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  p, -1);.      sq
60e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
60f0: 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 69 4d  v, OP_Divide, iM
6100: 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70 2c  em+i+1, regTemp,
6110: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
6120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6130: 70 31 28 76 2c 20 4f 50 5f 54 6f 49 6e 74 2c 20  p1(v, OP_ToInt, 
6140: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
6150: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6160: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
6170: 72 65 67 54 65 6d 70 2c 20 72 65 67 53 74 61 74  regTemp, regStat
6180: 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20  1, regStat1);.  
6190: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
61a0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
61b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
61c0: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 52 65  abname, 3, regRe
61d0: 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20 20  c, "aaa", 0);.  
61e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
61f0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
6200: 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  id, iStatCur, re
6210: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
6220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6230: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6240: 69 53 74 61 74 43 75 72 2c 20 72 65 67 52 65 63  iStatCur, regRec
6250: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
6260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6270: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6280: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 7d 0a 0a  G_APPEND);.  }..
6290: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
62a0: 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  e has no indices
62b0: 2c 20 63 72 65 61 74 65 20 61 20 73 69 6e 67 6c  , create a singl
62c0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 65  e sqlite_stat1 e
62d0: 6e 74 72 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ntry.  ** contai
62e0: 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68 65  ning NULL as the
62f0: 20 69 6e 64 65 78 20 6e 61 6d 65 20 61 6e 64 20   index name and 
6300: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 61 73  the row count as
6310: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20   the content..  
6320: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  */.  if( pTab->p
6330: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
6340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6350: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
6360: 2c 20 69 49 64 78 43 75 72 2c 20 70 54 61 62 2d  , iIdxCur, pTab-
6370: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
6380: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6390: 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   "%s", pTab->zNa
63a0: 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
63b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
63c0: 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72  P_Count, iIdxCur
63d0: 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20  , regStat1);.   
63e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63f0: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
6400: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 6a 5a  iIdxCur);.    jZ
6410: 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74 65  eroRows = sqlite
6420: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6430: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61 74  P_IfNot, regStat
6440: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
6450: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6460: 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f 52 6f 77  Here(v, jZeroRow
6470: 73 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77  s);.    jZeroRow
6480: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  s = sqlite3VdbeA
6490: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
64a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
64b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
64c0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78  _Null, 0, regIdx
64d0: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
64e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
64f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6500: 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 52  Tabname, 3, regR
6510: 65 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20  ec, "aaa", 0);. 
6520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6530: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6540: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
6550: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  NewRowid);.  sql
6560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6570: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
6580: 61 74 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72  atCur, regRec, r
6590: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 73  egNewRowid);.  s
65a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65b0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
65c0: 45 4e 44 29 3b 0a 20 20 69 66 28 20 70 50 61 72  END);.  if( pPar
65d0: 73 65 2d 3e 6e 4d 65 6d 3c 72 65 67 52 65 63 20  se->nMem<regRec 
65e0: 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d  ) pParse->nMem =
65f0: 20 72 65 67 52 65 63 3b 0a 20 20 73 71 6c 69 74   regRec;.  sqlit
6600: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6610: 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 7d 0a  , jZeroRows);.}.
6620: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6630: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6640: 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72  cause the most r
6650: 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c  ecent index anal
6660: 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f  ysis to.** be lo
6670: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e  aded into intern
6680: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 77  al hash tables w
6690: 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20 75  here is can be u
66a0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
66b0: 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73  oid loadAnalysis
66c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
66d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
66e0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
66f0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6700: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
6710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6720: 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  , OP_LoadAnalysi
6730: 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  s, iDb);.  }.}..
6740: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
6750: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f  ode that will do
6760: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
6770: 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  an entire databa
6780: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  se.*/.static voi
6790: 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73  d analyzeDatabas
67a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
67b0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
67c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
67d0: 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20  e->db;.  Schema 
67e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
67f0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
6800: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
6810: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f   database iDb */
6820: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a  .  HashElem *k;.
6830: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a    int iStatCur;.
6840: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 73    int iMem;..  s
6850: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
6860: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6870: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74  , 0, iDb);.  iSt
6880: 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  atCur = pParse->
6890: 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
68a0: 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65  nTab += 3;.  ope
68b0: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
68c0: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
68d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20  , 0, 0);.  iMem 
68e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
68f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6900: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6910: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6920: 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65  ;.  for(k=sqlite
6930: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
6940: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
6950: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
6960: 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(k)){.    Table
6970: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a   *pTab = (Table*
6980: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
6990: 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f  k);.    analyzeO
69a0: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
69b0: 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74 43 75  pTab, 0, iStatCu
69c0: 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  r, iMem);.  }.  
69d0: 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61  loadAnalysis(pPa
69e0: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
69f0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
6a00: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
6a10: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 20  n analysis of a 
6a20: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a  single table in.
6a30: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  ** a database.  
6a40: 49 66 20 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e  If pOnlyIdx is n
6a50: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
6a60: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  is a single inde
6a70: 78 0a 2a 2a 20 69 6e 20 70 54 61 62 20 74 68 61  x.** in pTab tha
6a80: 74 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c  t should be anal
6a90: 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yzed..*/.static 
6aa0: 76 6f 69 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c  void analyzeTabl
6ab0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6ac0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e   Table *pTab, In
6ad0: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a  dex *pOnlyIdx){.
6ae0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
6af0: 20 69 53 74 61 74 43 75 72 3b 0a 0a 20 20 61 73   iStatCur;..  as
6b00: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
6b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6b20: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
6b30: 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64  utexes(pParse->d
6b40: 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  b) );.  iDb = sq
6b50: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
6b60: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
6b70: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
6b80: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6b90: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6ba0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69  se, 0, iDb);.  i
6bb0: 53 74 61 74 43 75 72 20 3d 20 70 50 61 72 73 65  StatCur = pParse
6bc0: 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65  ->nTab;.  pParse
6bd0: 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69  ->nTab += 3;.  i
6be0: 66 28 20 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20  f( pOnlyIdx ){. 
6bf0: 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65     openStatTable
6c00: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53  (pParse, iDb, iS
6c10: 74 61 74 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78  tatCur, pOnlyIdx
6c20: 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b  ->zName, "idx");
6c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
6c40: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
6c50: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
6c60: 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  r, pTab->zName, 
6c70: 22 74 62 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e  "tbl");.  }.  an
6c80: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50  alyzeOneTable(pP
6c90: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c  arse, pTab, pOnl
6ca0: 79 49 64 78 2c 20 69 53 74 61 74 43 75 72 2c 20  yIdx, iStatCur, 
6cb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
6cc0: 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  .  loadAnalysis(
6cd0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a  pParse, iDb);.}.
6ce0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
6cf0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41  code for the ANA
6d00: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54  LYZE command.  T
6d10: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
6d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
6d30: 77 68 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a  when it recogniz
6d40: 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f  es an ANALYZE co
6d50: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
6d60: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20      ANALYZE     
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
6d90: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c        ANALYZE  <
6da0: 64 61 74 61 62 61 73 65 3e 20 20 20 20 20 20 20  database>       
6db0: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
6dc0: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
6dd0: 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
6de0: 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
6df0: 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
6e00: 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
6e10: 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
6e20: 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
6e30: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72  analyzed..** For
6e40: 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 2 analyzes all
6e50: 20 69 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e   indices the sin
6e60: 67 6c 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  gle database nam
6e70: 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e  ed..** Form 3 an
6e80: 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63  alyzes all indic
6e90: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
6ea0: 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
6eb0: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
6ec0: 74 65 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65  te3Analyze(Parse
6ed0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
6ee0: 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
6ef0: 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74  pName2){.  sqlit
6f00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6f10: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
6f20: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
6f30: 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c  *z, *zDb;.  Tabl
6f40: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
6f50: 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20   *pIdx;.  Token 
6f60: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20  *pTableName;..  
6f70: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
6f80: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
6f90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6fa0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
6fb0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
6fc0: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
6fd0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
6fe0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
6ff0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
7000: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
7010: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53  ->db) );.  if( S
7020: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
7030: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
7040: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
7050: 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
7060: 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70  ( pName2!=0 || p
7070: 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66  Name1==0 );.  if
7080: 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
7090: 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41     /* Form 1:  A
70a0: 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e  nalyze everythin
70b0: 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  g */.    for(i=0
70c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
70d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
70e0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  1 ) continue;  /
70f0: 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65  * Do not analyze
7100: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
7110: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c  se */.      anal
7120: 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72  yzeDatabase(pPar
7130: 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
7140: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
7150: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
7160: 20 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a   Form 2:  Analyz
7170: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  e the database o
7180: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f  r table named */
7190: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
71a0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
71b0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
71c0: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 6e  b>=0 ){.      an
71d0: 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50  alyzeDatabase(pP
71e0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
71f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
7200: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7210: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31  Token(db, pName1
7220: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29  );.      if( z )
7230: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
7240: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
7250: 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 30 29  dIndex(db, z, 0)
7260: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
7270: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
7280: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61  Parse, pIdx->pTa
7290: 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ble, pIdx);.    
72a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
72b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
72c0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
72d0: 20 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b   0, z, 0))!=0 ){
72e0: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
72f0: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
7300: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
7310: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
7320: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
7330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7350: 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20  Form 3: Analyze 
7360: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
7370: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  ied table name *
7380: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
7390: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
73a0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
73b0: 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61  Name2, &pTableNa
73c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
73d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  >=0 ){.      zDb
73e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
73f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d  zName;.      z =
7400: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7410: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
7420: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
7430: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66   z ){.        if
7440: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
7450: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7460: 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20  , zDb))!=0 ){.  
7470: 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54          analyzeT
7480: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49 64  able(pParse, pId
7490: 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78 29  x->pTable, pIdx)
74a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
74b0: 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c 69  if( (pTab = sqli
74c0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
74d0: 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62  Parse, 0, z, zDb
74e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
74f0: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
7500: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
7510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7520: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7530: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7540: 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d  }.    }   .  }.}
7550: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
7560: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
7570: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
7580: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
7590: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
75a0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
75b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
75c0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
75d0: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
75e0: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
75f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7600: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
7610: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
7620: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
7630: 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
7640: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
7650: 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65  when reading the
7660: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31  .** sqlite_stat1
7670: 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20   table.  .**.** 
7680: 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61      argv[0] = na
7690: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  me of the table.
76a0: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
76b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
76c0: 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55 4c  ex (might be NUL
76d0: 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32  L).**     argv[2
76e0: 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61  ] = results of a
76f0: 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74  nalysis - on int
7700: 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f  eger for each co
7710: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69  lumn.**.** Entri
7720: 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72 67  es for which arg
7730: 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c  v[1]==NULL simpl
7740: 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  y record the num
7750: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a  ber of rows in.*
7760: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  * the table..*/.
7770: 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
7780: 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a  sisLoader(void *
7790: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
77a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
77b0: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
77c0: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70   analysisInfo *p
77d0: 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73  Info = (analysis
77e0: 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49  Info*)pData;.  I
77f0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
7800: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
7810: 20 69 6e 74 20 69 2c 20 63 2c 20 6e 3b 0a 20 20   int i, c, n;.  
7820: 74 52 6f 77 63 6e 74 20 76 3b 0a 20 20 63 6f 6e  tRowcnt v;.  con
7830: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  st char *z;..  a
7840: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29  ssert( argc==3 )
7850: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7860: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61  ETER2(NotUsed, a
7870: 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  rgc);..  if( arg
7880: 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d  v==0 || argv[0]=
7890: 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30  =0 || argv[2]==0
78a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
78b0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
78c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
78d0: 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67  e(pInfo->db, arg
78e0: 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61  v[0], pInfo->zDa
78f0: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
7900: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
7910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7920: 69 66 28 20 61 72 67 76 5b 31 5d 20 29 7b 0a 20  if( argv[1] ){. 
7930: 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69     pIndex = sqli
7940: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e  te3FindIndex(pIn
7950: 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c  fo->db, argv[1],
7960: 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73   pInfo->zDatabas
7970: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
7980: 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
7990: 0a 20 20 6e 20 3d 20 70 49 6e 64 65 78 20 3f 20  .  n = pIndex ? 
79a0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
79b0: 3a 20 30 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b  : 0;.  z = argv[
79c0: 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a  2];.  for(i=0; *
79d0: 7a 20 26 26 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b  z && i<=n; i++){
79e0: 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20  .    v = 0;.    
79f0: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e  while( (c=z[0])>
7a00: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
7a10: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
7a20: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20   + c - '0';.    
7a30: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
7a40: 20 69 66 28 20 69 3d 3d 30 20 29 20 70 54 61 62   if( i==0 ) pTab
7a50: 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 76 3b  le->nRowEst = v;
7a60: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 3d  .    if( pIndex=
7a70: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7a80: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
7a90: 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  [i] = v;.    if(
7aa0: 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a   *z==' ' ) z++;.
7ab0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a      if( memcmp(z
7ac0: 2c 20 22 75 6e 6f 72 64 65 72 65 64 22 2c 20 31  , "unordered", 1
7ad0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0)==0 ){.      p
7ae0: 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
7af0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  d = 1;.      bre
7b00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7b10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7b20: 2a 2a 20 49 66 20 74 68 65 20 49 6e 64 65 78 2e  ** If the Index.
7b30: 61 53 61 6d 70 6c 65 20 76 61 72 69 61 62 6c 65  aSample variable
7b40: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65   is not NULL, de
7b50: 6c 65 74 65 20 74 68 65 20 61 53 61 6d 70 6c 65  lete the aSample
7b60: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20  [] array.** and 
7b70: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f  its contents..*/
7b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
7b90: 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28  eteIndexSamples(
7ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
7bb0: 65 78 20 2a 70 49 64 78 29 7b 0a 23 69 66 64 65  ex *pIdx){.#ifde
7bc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7bd0: 53 54 41 54 33 0a 20 20 69 66 28 20 70 49 64 78  STAT3.  if( pIdx
7be0: 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->aSample ){.   
7bf0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
7c00: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53 61  j=0; j<pIdx->nSa
7c10: 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  mple; j++){.    
7c20: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70    IndexSample *p
7c30: 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c   = &pIdx->aSampl
7c40: 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[j];.      if( 
7c50: 70 2d 3e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  p->eType==SQLITE
7c60: 5f 54 45 58 54 20 7c 7c 20 70 2d 3e 65 54 79 70  _TEXT || p->eTyp
7c70: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
7c80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7c90: 33 5f 66 72 65 65 28 70 2d 3e 75 2e 7a 29 3b 0a  3_free(p->u.z);.
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7cb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7cc0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20  Idx->aSample);. 
7cd0: 20 7d 0a 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70   }.  pIdx->nSamp
7ce0: 6c 65 20 3d 20 30 3b 0a 20 20 70 49 64 78 2d 3e  le = 0;.  pIdx->
7cf0: 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6c  aSample = 0;.#el
7d00: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
7d10: 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
7d20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49  SED_PARAMETER(pI
7d30: 64 78 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  dx);.#endif.}..#
7d40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7d50: 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
7d60: 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  Load content fro
7d70: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
7d80: 74 33 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68  t3 table into th
7d90: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  e Index.aSample[
7da0: 5d 0a 2a 2a 20 61 72 72 61 79 73 20 6f 66 20 61  ].** arrays of a
7db0: 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73  ll indices..*/.s
7dc0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74  tatic int loadSt
7dd0: 61 74 33 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  at3(sqlite3 *db,
7de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
7df0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7e20: 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  es from subrouti
7e30: 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nes */.  sqlite3
7e40: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
7e50: 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c  ;      /* An SQL
7e60: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7e70: 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a   run */.  char *
7e80: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
7ea0: 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
7eb0: 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ment */.  Index 
7ec0: 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20 20  *pPrevIdx = 0;  
7ed0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
7ee0: 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ous index in the
7ef0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
7f00: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
7f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 6c 6f 74           /* slot
7f20: 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c   in pIdx->aSampl
7f30: 65 5b 5d 20 66 6f 72 20 6e 65 78 74 20 73 61 6d  e[] for next sam
7f40: 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ple */.  int eTy
7f50: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
7f60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 74 79         /* Dataty
7f70: 70 65 20 6f 66 20 61 20 73 61 6d 70 6c 65 20 2a  pe of a sample *
7f80: 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  /.  IndexSample 
7f90: 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20  *pSample;       
7fa0: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70    /* A slot in p
7fb0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a  Idx->aSample[] *
7fc0: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
7fd0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
7fe0: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 7a  sqlite_stat3", z
7ff0: 44 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Db) ){.    retur
8000: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8010: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
8020: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
8030: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78       "SELECT idx
8040: 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25  ,count(*) FROM %
8050: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 22 0a  Q.sqlite_stat3".
8060: 20 20 20 20 20 20 22 20 47 52 4f 55 50 20 42 59        " GROUP BY
8070: 20 69 64 78 22 2c 20 7a 44 62 29 3b 0a 20 20 69   idx", zDb);.  i
8080: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
8090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
80a0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
80b0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
80c0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
80d0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
80e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
80f0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
8100: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
8110: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
8120: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
8130: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72  _ROW ){.    char
8140: 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49   *zIndex;   /* I
8150: 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ndex name */.   
8160: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
8170: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8180: 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  he index object 
8190: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d 70  */.    int nSamp
81a0: 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  le;    /* Number
81b0: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 0a   of samples */..
81c0: 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68      zIndex = (ch
81d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
81e0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
81f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64  0);.    if( zInd
8200: 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ex==0 ) continue
8210: 3b 0a 20 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20  ;.    nSample = 
8220: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
8230: 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  nt(pStmt, 1);.  
8240: 20 20 69 66 28 20 6e 53 61 6d 70 6c 65 3e 32 35    if( nSample>25
8250: 35 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  5 ) continue;.  
8260: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
8270: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 49  FindIndex(db, zI
8280: 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ndex, zDb);.    
8290: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f  if( pIdx==0 ) co
82a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
82b0: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
82c0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 64 78  e==0 );.    pIdx
82d0: 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 28 75 38 29  ->nSample = (u8)
82e0: 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 70 49 64  nSample;.    pId
82f0: 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c  x->aSample = sql
8300: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
8310: 6e 53 61 6d 70 6c 65 2a 73 69 7a 65 6f 66 28 49  nSample*sizeof(I
8320: 6e 64 65 78 53 61 6d 70 6c 65 29 20 29 3b 0a 20  ndexSample) );. 
8330: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61     if( pIdx->aSa
8340: 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mple==0 ){.     
8350: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8360: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
8370: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8380: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
8390: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
83a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
83b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
83c0: 74 6d 74 29 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  tmt);..  zSql = 
83d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
83e0: 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  b, .      "SELEC
83f0: 54 20 69 64 78 2c 6e 6c 74 2c 6e 65 71 2c 73 61  T idx,nlt,neq,sa
8400: 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c  mple FROM %Q.sql
8410: 69 74 65 5f 73 74 61 74 33 22 0a 20 20 20 20 20  ite_stat3".     
8420: 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 78 2c   " ORDER BY idx,
8430: 20 6e 6c 74 22 2c 20 7a 44 62 29 3b 0a 20 20 69   nlt", zDb);.  i
8440: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
8450: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8460: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
8470: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
8480: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
8490: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
84a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
84b0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
84c0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
84d0: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
84e0: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
84f0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72  _ROW ){.    char
8500: 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49   *zIndex;   /* I
8510: 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ndex name */.   
8520: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
8530: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8540: 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  he index object 
8550: 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d  */..    zIndex =
8560: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
8570: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
8580: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
8590: 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74  zIndex==0 ) cont
85a0: 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 20 3d  inue;.    pIdx =
85b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
85c0: 78 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44  x(db, zIndex, zD
85d0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
85e0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
85f0: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 70 50      if( pIdx==pP
8600: 72 65 76 49 64 78 20 29 7b 0a 20 20 20 20 20 20  revIdx ){.      
8610: 69 64 78 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  idx++;.    }else
8620: 7b 0a 20 20 20 20 20 20 70 50 72 65 76 49 64 78  {.      pPrevIdx
8630: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 69   = pIdx;.      i
8640: 64 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  dx = 0;.    }.  
8650: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 49    assert( idx<pI
8660: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
8670: 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 49     pSample = &pI
8680: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 64 78 5d  dx->aSample[idx]
8690: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e  ;.    pSample->n
86a0: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 29 73 71  Lt = (tRowcnt)sq
86b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
86c0: 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
86d0: 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 20 3d    pSample->nEq =
86e0: 20 28 74 52 6f 77 63 6e 74 29 73 71 6c 69 74 65   (tRowcnt)sqlite
86f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
8700: 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 65 54  Stmt, 2);.    eT
8710: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ype = sqlite3_co
8720: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
8730: 20 33 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65   3);.    pSample
8740: 2d 3e 65 54 79 70 65 20 3d 20 28 75 38 29 65 54  ->eType = (u8)eT
8750: 79 70 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28  ype;.    switch(
8760: 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   eType ){.      
8770: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
8780: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  GER: {.        p
8790: 53 61 6d 70 6c 65 2d 3e 75 2e 69 20 3d 20 73 71  Sample->u.i = sq
87a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
87b0: 36 34 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20  64(pStmt, 3);.  
87c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
87d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
87e0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
87f0: 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d          pSample-
8800: 3e 75 2e 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  >u.r = sqlite3_c
8810: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
8820: 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  mt, 3);.        
8830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8840: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8850: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
8860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8870: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
8880: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
8890: 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79  LITE_TEXT || eTy
88a0: 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
88b0: 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ); {.        con
88c0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
88d0: 6e 73 74 20 63 68 61 72 20 2a 29 28 0a 20 20 20  nst char *)(.   
88e0: 20 20 20 20 20 20 20 20 20 20 20 28 65 54 79 70             (eTyp
88f0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 29 20  e==SQLITE_BLOB) 
8900: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8910: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
8920: 6c 6f 62 28 70 53 74 6d 74 2c 20 33 29 3a 0a 20  lob(pStmt, 3):. 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8940: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
8950: 28 70 53 74 6d 74 2c 20 33 29 0a 20 20 20 20 20  (pStmt, 3).     
8960: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
8970: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
8980: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
8990: 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  tmt, 2);.       
89a0: 20 69 66 28 20 6e 3e 30 78 66 66 66 66 20 29 20   if( n>0xffff ) 
89b0: 6e 20 3d 20 30 78 66 66 66 66 3b 0a 20 20 20 20  n = 0xffff;.    
89c0: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 42 79      pSample->nBy
89d0: 74 65 20 3d 20 28 75 31 36 29 6e 3b 0a 20 20 20  te = (u16)n;.   
89e0: 20 20 20 20 20 69 66 28 20 6e 20 3c 20 31 29 7b       if( n < 1){
89f0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 61 6d 70  .          pSamp
8a00: 6c 65 2d 3e 75 2e 7a 20 3d 20 30 3b 0a 20 20 20  le->u.z = 0;.   
8a10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a20: 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 75        pSample->u
8a30: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .z = sqlite3Mall
8a40: 6f 63 28 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oc(n);.         
8a50: 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 75 2e   if( pSample->u.
8a60: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
8a70: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
8a80: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
8a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8aa0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8ab0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
8ac0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8ad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ae0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53 61        memcpy(pSa
8af0: 6d 70 6c 65 2d 3e 75 2e 7a 2c 20 7a 2c 20 6e 29  mple->u.z, z, n)
8b00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8b10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8b20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
8b30: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
8b40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8b50: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20  TE_ENABLE_STAT3 
8b60: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  */../*.** Load t
8b70: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
8b80: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61  e sqlite_stat1 a
8b90: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
8ba0: 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63  tables. The.** c
8bb0: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
8bc0: 65 5f 73 74 61 74 31 20 61 72 65 20 75 73 65 64  e_stat1 are used
8bd0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
8be0: 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
8bf0: 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65  ].** arrays. The
8c00: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c   contents of sql
8c10: 69 74 65 5f 73 74 61 74 33 20 61 72 65 20 75 73  ite_stat3 are us
8c20: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
8c30: 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d  he.** Index.aSam
8c40: 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a  ple[] arrays..**
8c50: 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74  .** If the sqlit
8c60: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73  e_stat1 table is
8c70: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
8c80: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51  the database, SQ
8c90: 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73  LITE_ERROR.** is
8ca0: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
8cb0: 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66  is case, even if
8cc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8cd0: 54 41 54 33 20 77 61 73 20 64 65 66 69 6e 65 64  TAT3 was defined
8ce0: 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70   .** during comp
8cf0: 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  ilation and the 
8d00: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
8d10: 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e  le is present, n
8d20: 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65  o data is .** re
8d30: 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a  ad from it..**.*
8d40: 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
8d50: 4c 45 5f 53 54 41 54 33 20 77 61 73 20 64 65 66  LE_STAT3 was def
8d60: 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f 6d 70  ined during comp
8d70: 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  ilation and the 
8d80: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33  .** sqlite_stat3
8d90: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72   table is not pr
8da0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
8db0: 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52  abase, SQLITE_ER
8dc0: 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ROR is.** return
8dd0: 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20  ed. However, in 
8de0: 74 68 69 73 20 63 61 73 65 2c 20 64 61 74 61 20  this case, data 
8df0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8e00: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a 2a   sqlite_stat1.**
8e10: 20 74 61 62 6c 65 20 28 69 66 20 69 74 20 69 73   table (if it is
8e20: 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f 72 65   present) before
8e30: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
8e40: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
8e50: 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66  r occurs, this f
8e60: 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
8e70: 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ets db->mallocFa
8e80: 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65  iled..** This me
8e90: 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c 6c 65  ans if the calle
8ea0: 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72 65 20  r does not care 
8eb0: 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72 72 6f  about other erro
8ec0: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 0a 2a  rs, the return.*
8ed0: 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20 69 67  * code may be ig
8ee0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
8ef0: 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61  lite3AnalysisLoa
8f00: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
8f10: 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79  nt iDb){.  analy
8f20: 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20  sisInfo sInfo;. 
8f30: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
8f40: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
8f50: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
8f60: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
8f70: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
8f80: 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
8f90: 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  .pBt!=0 );..  /*
8fa0: 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72   Clear any prior
8fb0: 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
8fc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8fd0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
8fe0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
8ff0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9000: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
9010: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
9020: 78 48 61 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74  xHash);i;i=sqlit
9030: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9040: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
9050: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
9060: 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  i);.    sqlite3D
9070: 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64  efaultRowEst(pId
9080: 78 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  x);.#ifdef SQLIT
9090: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
90a0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
90b0: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c  IndexSamples(db,
90c0: 20 70 49 64 78 29 3b 0a 20 20 20 20 70 49 64 78   pIdx);.    pIdx
90d0: 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23  ->aSample = 0;.#
90e0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
90f0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
9100: 72 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  re the sqlite_st
9110: 61 74 31 20 74 61 62 6c 65 20 65 78 69 73 74 73  at1 table exists
9120: 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d   */.  sInfo.db =
9130: 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61   db;.  sInfo.zDa
9140: 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62  tabase = db->aDb
9150: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69  [iDb].zName;.  i
9160: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
9170: 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
9180: 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44  stat1", sInfo.zD
9190: 61 74 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20  atabase)==0 ){. 
91a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
91b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
91c0: 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69  * Load new stati
91d0: 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65  stics out of the
91e0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
91f0: 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20  ble */.  zSql = 
9200: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9210: 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  b, .      "SELEC
9220: 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46  T tbl,idx,stat F
9230: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
9240: 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  at1", sInfo.zDat
9250: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 7a 53  abase);.  if( zS
9260: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ql==0 ){.    rc 
9270: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
9290: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
92a0: 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69  b, zSql, analysi
92b0: 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c  sLoader, &sInfo,
92c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
92d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
92e0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f 61  ;.  }...  /* Loa
92f0: 64 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73  d the statistics
9300: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
9310: 5f 73 74 61 74 33 20 74 61 62 6c 65 2e 20 2a 2f  _stat3 table. */
9320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9330: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 69 66  NABLE_STAT3.  if
9340: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9350: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64  ){.    rc = load
9360: 53 74 61 74 33 28 64 62 2c 20 73 49 6e 66 6f 2e  Stat3(db, sInfo.
9370: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 0a  zDatabase);.  }.
9380: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
9390: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
93a0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
93b0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
93c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
93d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
93e0: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
93f0: 2f 0a                                            /.