/ Hex Artifact Content
Login

Artifact e8c8a9d20beb2ad156321330e8f4fea002d8deee:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 69 63 73 20 72 65  the statisics re
0730: 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74 68  quired.** for th
0740: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
0750: 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68 6f  to make good cho
0760: 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d  ices..**.** Form
0770: 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  at of sqlite_sta
0780: 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  t1:.**.** There 
0790: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65 20  is normally one 
07a0: 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20 77  row per index, w
07b0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69 64  ith the index id
07c0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 0a  entified by the.
07d0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 69  ** name in the i
07e0: 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  dx column.  The 
07f0: 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  tbl column is th
0800: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0810: 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68 20  ble to.** which 
0820: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0830: 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63 68  s.  In each such
0840: 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20 63   row, the stat c
0850: 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  olumn will be.**
0860: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73   a string consis
0870: 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20 6f  ting of a list o
0880: 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65  f integers.  The
0890: 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
08a0: 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20 69  n this.** list i
08b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
08c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
08d0: 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  x.  (This is the
08e0: 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20   same as the.** 
08f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0900: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78 63  n the table, exc
0910: 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c 20  ept for partial 
0920: 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20 73  indices.)  The s
0930: 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65 72  econd.** integer
0940: 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65 20   is the average 
0950: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0960: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
0970: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a 2a   have the same.*
0980: 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 66  * value in the f
0990: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
09a0: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74  he index.  The t
09b0: 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73 20  hird integer is 
09c0: 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20 6e  the average.** n
09d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
09e0: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
09f0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
0a00: 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  lue for the firs
0a10: 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  t two.** columns
0a20: 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74 65  .  The N-th inte
0a30: 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69 73  ger (for N>1) is
0a40: 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75 6d   the average num
0a50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
0a60: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68 69  ** the index whi
0a70: 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ch have the same
0a80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66   value for the f
0a90: 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e 73  irst N-1 columns
0aa0: 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63 6f  .  For.** a K-co
0ab0: 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65 72  lumn index, ther
0ac0: 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69 6e  e will be K+1 in
0ad0: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 74  tegers in the st
0ae0: 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a 2a  at column.  If.*
0af0: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75  * the index is u
0b00: 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65 20  nique, then the 
0b10: 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69 6c  last integer wil
0b20: 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  l be 1..**.** Th
0b30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  e list of intege
0b40: 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20 63  rs in the stat c
0b50: 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f 6e  olumn can option
0b60: 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65 64  ally be followed
0b70: 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77 6f  .** by the keywo
0b80: 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e 20  rd "unordered". 
0b90: 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22   The "unordered"
0ba0: 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74 20   keyword, if it 
0bb0: 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20 6d  is present,.** m
0bc0: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 64  ust be separated
0bd0: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 69   from the last i
0be0: 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e 67  nteger by a sing
0bf0: 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74 68  le space.  If th
0c00: 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64 22  e.** "unordered"
0c10: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0c20: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71 75  ent, then the qu
0c30: 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  ery planner assu
0c40: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
0c50: 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65 72  index is unorder
0c60: 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  ed and will not 
0c70: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66 6f  use the index fo
0c80: 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79 2e  r a range query.
0c90: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
0ca0: 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78 20  qlite_stat1.idx 
0cb0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c 20  column is NULL, 
0cc0: 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
0cd0: 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63 6f  stat1.stat.** co
0ce0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
0cf0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 77  single integer w
0d00: 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73 74  hich is the (est
0d10: 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20 6f  imated) number o
0d20: 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65  f.** rows in the
0d30: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
0d40: 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61 74  d by sqlite_stat
0d50: 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  1.tbl..**.** For
0d60: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0d70: 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  at2:.**.** The s
0d80: 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6f  qlite_stat2 is o
0d90: 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 20  nly created and 
0da0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
0db0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
0dc0: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
0dd0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 61  E_ENABLE_STAT2 a
0de0: 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  nd if the SQLite
0df0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
0e00: 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33 2e  is between.** 3.
0e10: 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e 20  6.18 and 3.7.8. 
0e20: 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61 62   The "stat2" tab
0e30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  le contains addi
0e40: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
0e50: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  on.** about the 
0e60: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 20  distribution of 
0e70: 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20 69  keys within an i
0e80: 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65 78  ndex.  The index
0e90: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
0ea0: 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20 63  y.** the "idx" c
0eb0: 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22 74  olumn and the "t
0ec0: 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  bl" column is th
0ed0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0ee0: 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a 20  ble to which.** 
0ef0: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0f00: 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75 73  s.  There are us
0f10: 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69 6e  ually 10 rows in
0f20: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0f30: 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 65  2.** table for e
0f40: 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ach index..**.**
0f50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0f60: 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6e  2 entries for an
0f70: 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76 65   index that have
0f80: 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65 65   sampleno betwee
0f90: 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e 63  n 0 and 9.** inc
0fa0: 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70 6c  lusive are sampl
0fb0: 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  es of the left-m
0fc0: 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69 6e  ost key value in
0fd0: 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65 6e   the index taken
0fe0: 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73 70   at.** evenly sp
0ff0: 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f 6e  aced points alon
1000: 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c 65  g the index.  Le
1010: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1020: 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a 20  samples be S.** 
1030: 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e 64  (10 in the stand
1040: 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20 6c  ard build) and l
1050: 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d 62  et C be the numb
1060: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1070: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 6e  e index..** Then
1080: 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f 77   the sampled row
1090: 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a 0a  s are given by:.
10a0: 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75 6d  **.**     rownum
10b0: 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20 43  ber = (i*C*2 + C
10c0: 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46 6f  )/(S*2).**.** Fo
10d0: 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61 6e  r i between 0 an
10e0: 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74 75  d S-1.  Conceptu
10f0: 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78 20  ally, the index 
1100: 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65 64  space is divided
1110: 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66 6f   into.** S unifo
1120: 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20 74  rm buckets and t
1130: 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20 74  he samples are t
1140: 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66 72  he middle row fr
1150: 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e 0a  om each bucket..
1160: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
1170: 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74   for sqlite_stat
1180: 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68 65  2 is recorded he
1190: 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72 65  re for legacy re
11a0: 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a 2a  ference.  This.*
11b0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  * version of SQL
11c0: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ite does not sup
11d0: 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61 74  port sqlite_stat
11e0: 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20 72  2.  It neither r
11f0: 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69 74  eads nor.** writ
1200: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  es the sqlite_st
1210: 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69 73  at2 table.  This
1220: 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69   version of SQLi
1230: 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  te only supports
1240: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33  .** sqlite_stat3
1250: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1260: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 3a  or sqlite_stat3:
1270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
1280: 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20 69  e_stat3 format i
1290: 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73 71  s a subset of sq
12a0: 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65 6e  lite_stat4.  Hen
12b0: 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ce, the.** sqlit
12c0: 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20 77  e_stat4 format w
12d0: 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65 64  ill be described
12e0: 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65 72   first.  Further
12f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1300: 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74 61  about sqlite_sta
1310: 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73  t3 follows the s
1320: 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73 63  qlite_stat4 desc
1330: 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ription..**.** F
1340: 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65  ormat for sqlite
1350: 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41 73  _stat4:.**.** As
1360: 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74 61   with sqlite_sta
1370: 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f 73  t2, the sqlite_s
1380: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1390: 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64 61  ins histogram da
13a0: 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68 65  ta.** to aid the
13b0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69   query planner i
13c0: 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64 20  n choosing good 
13d0: 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f 6e  indices based on
13e0: 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 74   the values.** t
13f0: 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  hat indexed colu
1400: 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  mns are compared
1410: 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65 20   against in the 
1420: 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f 66  WHERE clauses of
1430: 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  .** queries..**.
1440: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  ** The sqlite_st
1450: 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  at4 table contai
1460: 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74 72  ns multiple entr
1470: 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ies for each ind
1480: 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20 63  ex..** The idx c
1490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65 20  olumn names the 
14a0: 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74 62  index and the tb
14b0: 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  l column is the 
14c0: 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20  table of the.** 
14d0: 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 69  index.  If the i
14e0: 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75 6d  dx and tbl colum
14f0: 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2c  ns are the same,
1500: 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c 65   then the sample
1510: 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e   is.** of the IN
1520: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1530: 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20 63  Y.  The sample c
1540: 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62 20  olumn is a blob 
1550: 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20  which is the.** 
1560: 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67 20  binary encoding 
1570: 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  of a key from th
1580: 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e 45  e index.  The nE
1590: 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a 2a  q column is a.**
15a0: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72   list of integer
15b0: 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  s.  The first in
15c0: 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70 70  teger is the app
15d0: 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72 0a  roximate number.
15e0: 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  ** of entries in
15f0: 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   the index whose
1600: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1610: 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  n exactly matche
1620: 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s.** the left-mo
1630: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1640: 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73 65   sample.  The se
1650: 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e 20  cond integer in 
1660: 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61 70  nEq.** is the ap
1670: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
1680: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
1690: 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20 74  he index where t
16a0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f 20  he.** first two 
16b0: 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74 68  columns match th
16c0: 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c 75  e first two colu
16d0: 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  mns of the sampl
16e0: 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  e..** And so for
16f0: 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f 74  th.  nLt is anot
1700: 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74 65  her list of inte
1710: 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20 74  gers that show t
1720: 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a 2a  he approximate.*
1730: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * number of entr
1740: 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74 72  ies that are str
1750: 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ictly less than 
1760: 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65  the sample.  The
1770: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65   first.** intege
1780: 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69 6e  r in nLt contain
1790: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17a0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
17b0: 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a 2a  ndex where the.*
17c0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
17d0: 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  mn is less than 
17e0: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  the left-most co
17f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d 70  lumn of the samp
1800: 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68 20  le..** The K-th 
1810: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e  integer in the n
1820: 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  Lt entry is the 
1830: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
1840: 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65 72  entries .** wher
1850: 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63 6f  e the first K co
1860: 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20 74  lumns are less t
1870: 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b 20  han the first K 
1880: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a  columns of the.*
1890: 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 6e  * sample.  The n
18a0: 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c 69  DLt column is li
18b0: 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74 68  ke nLt except th
18c0: 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  at it contains t
18d0: 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
18e0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69 65   distinct entrie
18f0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74  s in the index t
1900: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
1910: 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65 2e  n the.** sample.
1920: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e  .**.** There can
1930: 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72 79   be an arbitrary
1940: 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74   number of sqlit
1950: 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73 20  e_stat4 entries 
1960: 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68  per index..** Th
1970: 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1980: 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79  d will typically
1990: 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74 65   generate sqlite
19a0: 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a 2a  _stat4 tables.**
19b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62 65   that contain be
19c0: 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30 20  tween 10 and 40 
19d0: 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61 72  samples which ar
19e0: 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61 63  e distributed ac
19f0: 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79 20  ross.** the key 
1a00: 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e 6f  space, though no
1a10: 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e 64  t uniformly, and
1a20: 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20 73   which include s
1a30: 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20 6c  amples with.** l
1a40: 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73 2e  arge nEq values.
1a50: 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66 6f  .**.** Format fo
1a60: 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 72  r sqlite_stat3 r
1a70: 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  edux:.**.** The 
1a80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
1a90: 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69 74  le is like sqlit
1aa0: 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20 74  e_stat4 except t
1ab0: 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20 6c  hat it only.** l
1ac0: 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66 74  ooks at the left
1ad0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
1ae0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
1af0: 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61 6d  sqlite_stat3.sam
1b00: 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 6f  ple.** column co
1b10: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1b20: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  l value of the l
1b30: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
1b40: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61 20  instead.** of a 
1b50: 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f 66  blob encoding of
1b60: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69 6e   the complete in
1b70: 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66 6f  dex key as is fo
1b80: 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  und in.** sqlite
1b90: 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20 20  _stat4.sample.  
1ba0: 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61 6e  The nEq, nLt, an
1bb0: 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20 6f  d nDLt entries o
1bc0: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a  f sqlite_stat3.*
1bd0: 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a 75  * all contain ju
1be0: 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  st a single inte
1bf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1c00: 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69 72   same as the fir
1c10: 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e  st.** integer in
1c20: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
1c30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69 74  columns in sqlit
1c40: 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66 6e  e_stat4..*/.#ifn
1c50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c60: 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64 65  ANALYZE.#include
1c70: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
1c80: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
1ca0: 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61 74  .# define IsStat
1cb0: 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e 65  4     1.# define
1cc0: 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a 23   IsStat3     0.#
1cd0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1cf0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1d00: 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  t4     0.# defin
1d10: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31 0a  e IsStat3     1.
1d20: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 49  #else.# define I
1d30: 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20 64  sStat4     0.# d
1d40: 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20 20  efine IsStat3   
1d50: 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c 49    0.# undef SQLI
1d60: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
1d70: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1d80: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 31  _STAT4_SAMPLES 1
1d90: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
1da0: 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73 53  IsStat34    (IsS
1db0: 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20 2f  tat3+IsStat4)  /
1dc0: 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f 72  * 1 for STAT3 or
1dd0: 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72 77   STAT4. 0 otherw
1de0: 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ise */../*.** Th
1df0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
1e00: 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6f  ates code that o
1e10: 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65 5f  pens the sqlite_
1e20: 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a 2a  statN tables..**
1e30: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
1e40: 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  1 table is alway
1e50: 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71 6c  s relevant.  sql
1e60: 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f 77  ite_stat2 is now
1e70: 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20 73  .** obsolete.  s
1e80: 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64 20  qlite_stat3 and 
1e90: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72 65  sqlite_stat4 are
1ea0: 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68 65   only opened whe
1eb0: 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  n.** appropriate
1ec0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1ed0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69 64  tions are provid
1ee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ef0: 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
1f00: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65 76  bles do not prev
1f10: 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69 74  iously exist, it
1f20: 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1f30: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68 65  ** Argument zWhe
1f40: 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e  re may be a poin
1f50: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1f60: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61 62  containing a tab
1f70: 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20 69  le name,.** or i
1f80: 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c 20  t may be a NULL 
1f90: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
1fa0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
1fb0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1fc0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  ** the sqlite_st
1fd0: 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f 63  atN tables assoc
1fe0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
1ff0: 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20 64  amed table are d
2000: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a 57  eleted..** If zW
2010: 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63 6f  here==0, then co
2020: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
2030: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 74  to delete all st
2040: 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  at table entries
2050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2060: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 0a   openStatTable(.
2070: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2090: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20a0: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20c0: 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72 65   database we are
20d0: 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a 20   looking in */. 
20e0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
20f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2100: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
2110: 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  1 table on this 
2120: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
2130: 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 20  t char *zWhere, 
2140: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 6e      /* Delete en
2150: 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20 74  tries for this t
2160: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
2170: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2180: 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45 69  WhereType  /* Ei
2190: 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22 69  ther "tbl" or "i
21a0: 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  dx" */.){.  stat
21b0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
21c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
21d0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e   *zName;.    con
21e0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 0a  st char *zCols;.
21f0: 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20 7b    } aTable[] = {
2200: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
2210: 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat1", "tbl,idx,
2220: 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65 66  stat" },.#if def
2230: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2240: 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b 20  LE_STAT4).    { 
2250: 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20  "sqlite_stat4", 
2260: 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c 74  "tbl,idx,neq,nlt
2270: 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d 2c  ,ndlt,sample" },
2280: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
2290: 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c 69  tat3", 0 },.#eli
22a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20  _ENABLE_STAT3). 
22c0: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74 61     { "sqlite_sta
22d0: 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e 65  t3", "tbl,idx,ne
22e0: 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c  q,nlt,ndlt,sampl
22f0: 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c  e" },.    { "sql
2300: 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c  ite_stat4", 0 },
2310: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 71  .#else.    { "sq
2320: 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20 7d  lite_stat3", 0 }
2330: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2340: 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65 6e  stat4", 0 },.#en
2350: 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  dif.  };.  int i
2360: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2370: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2380: 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65 20  Db *pDb;.  Vdbe 
2390: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
23a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
23b0: 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53 69  nt aRoot[ArraySi
23c0: 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20 75  ze(aTable)];.  u
23d0: 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72 72  8 aCreateTbl[Arr
23e0: 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b  aySize(aTable)];
23f0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2400: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2410: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2420: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2430: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2440: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d 3d  lite3VdbeDb(v)==
2450: 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  db );.  pDb = &d
2460: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2470: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73 74  /* Create new st
2480: 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20 69  atistic tables i
2490: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65 78  f they do not ex
24a0: 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74 68  ist, or clear th
24b0: 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20  em.  ** if they 
24c0: 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  do already exist
24d0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
24e0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
24f0: 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  able); i++){.   
2500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2510: 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e  b = aTable[i].zN
2520: 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ame;.    Table *
2530: 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20 28  pStat;.    if( (
2540: 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33 46  pStat = sqlite3F
2550: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
2560: 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 3d  b, pDb->zName))=
2570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2580: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 20  aTable[i].zCols 
2590: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25a0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
25b0: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
25c0: 69 73 74 2e 20 43 72 65 61 74 65 20 69 74 2e 20  ist. Create it. 
25d0: 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20 20 20  Note that a .   
25e0: 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65 66 66       ** side-eff
25f0: 65 63 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ect of the CREAT
2600: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2610: 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20 74 68  t is to leave th
2620: 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20 20 20  e rootpage .    
2630: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 65      ** of the ne
2640: 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73  w table in regis
2650: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
2660: 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69 6d 70  oot. This is imp
2670: 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20 20 20  ortant .        
2680: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 4f  ** because the O
2690: 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64 65 20  penWrite opcode 
26a0: 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20 6e 65  below will be ne
26b0: 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20  eding it. */.   
26c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
26d0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
26f0: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25 73 28  ATE TABLE %Q.%s(
2700: 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  %s)", pDb->zName
2710: 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65 5b 69  , zTab, aTable[i
2720: 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20 20 20  ].zCols.        
2730: 29 3b 0a 20 20 20 20 20 20 20 20 61 52 6f 6f 74  );.        aRoot
2740: 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  [i] = pParse->re
2750: 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 61  gRoot;.        a
2760: 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 4f  CreateTbl[i] = O
2770: 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3b 0a 20  PFLAG_P2ISREG;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2790: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
27a0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
27b0: 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65 20 69  sts. If zWhere i
27c0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65  s not NULL, dele
27d0: 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a  te all entries .
27e0: 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61        ** associa
27f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
2800: 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20 7a 57  le zWhere. If zW
2810: 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65  here is NULL, de
2820: 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2830: 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
2840: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
2850: 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 69  */.      aRoot[i
2860: 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b  ] = pStat->tnum;
2870: 0a 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62  .      aCreateTb
2880: 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  l[i] = 0;.      
2890: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
28a0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 61 52  (pParse, iDb, aR
28b0: 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54 61 62 29  oot[i], 1, zTab)
28c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 57 68 65  ;.      if( zWhe
28d0: 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
28e0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
28f0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
2900: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
2910: 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d   %Q.%s WHERE %s=
2920: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %Q",.           
2930: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62  pDb->zName, zTab
2940: 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20 7a 57  , zWhereType, zW
2950: 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  here.        );.
2960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2970: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69       /* The sqli
2980: 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61 62  te_stat[134] tab
2990: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
29a0: 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 72  s.  Delete all r
29b0: 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
29c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29d0: 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61  2(v, OP_Clear, a
29e0: 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20  Root[i], iDb);. 
29f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a00: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2a10: 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
2a20: 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69 74   tables for writ
2a30: 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ing. */.  for(i=
2a40: 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f  0; aTable[i].zCo
2a50: 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ls; i++){.    as
2a60: 73 65 72 74 28 20 69 3c 41 72 72 61 79 53 69 7a  sert( i<ArraySiz
2a70: 65 28 61 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  e(aTable) );.   
2a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2aa0: 57 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2b  Write, iStatCur+
2ab0: 69 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62  i, aRoot[i], iDb
2ac0: 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 3);.    sqlite
2ad0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2ae0: 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b   aCreateTbl[i]);
2af0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2b00: 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65 72  commended number
2b10: 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72 20   of samples for 
2b20: 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f 0a  sqlite_stat4.*/.
2b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
2b40: 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20 64  TAT4_SAMPLES.# d
2b50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41  efine SQLITE_STA
2b60: 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23 65  T4_SAMPLES 24.#e
2b70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65  ndif../*.** Thre
2b80: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  e SQL functions 
2b90: 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20 73  - stat_init(), s
2ba0: 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64 20  tat_push(), and 
2bb0: 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a 20  stat_get() -.** 
2bc0: 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e 63  share an instanc
2bd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2be0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ng structure to 
2bf0: 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74 65  hold their state
2c00: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  .** information.
2c10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2c20: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53 74  ct Stat4Accum St
2c30: 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64 65  at4Accum;.typede
2c40: 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53 61  f struct Stat4Sa
2c50: 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c 65  mple Stat4Sample
2c60: 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53 61  ;.struct Stat4Sa
2c70: 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e 74  mple {.  tRowcnt
2c80: 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20 20   *anEq;         
2c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2ca0: 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f 0a  te_stat4.nEq */.
2cb0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74    tRowcnt *anDLt
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cd0: 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74    /* sqlite_stat
2ce0: 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65 66  4.nDLt */.#ifdef
2cf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2d00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2d10: 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20 20  tRowcnt *anLt;  
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34 2e  /* sqlite_stat4.
2d40: 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  nLt */.  union {
2d50: 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 6e       /* Rowid in
2d80: 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20 74   main table of t
2d90: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75 38  he key */.    u8
2da0: 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20 20   *aRowid;       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc0: 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55 54   Key for WITHOUT
2dd0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
2de0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e 52  .  } u;.  u32 nR
2df0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2e10: 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f 0a  eof aRowid[] */.
2e20: 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b 20    u8 isPSample; 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
2e50: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a  eriodic sample *
2e60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53 61      /* If !isPSa
2e90: 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f 6e  mple, the reason
2ea0: 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a   for inclusion *
2eb0: 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20 20  /.  u32 iHash;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b 65      /* Tiebreake
2ee0: 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69 66  r hash */.#endif
2ef0: 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20 53         .struct S
2f30: 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74 52  tat4Accum {.  tR
2f40: 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20  owcnt nRow;     
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f60: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2f70: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
2f80: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d  .  tRowcnt nPSam
2f90: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ple;         /* 
2fa0: 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20  How often to do 
2fb0: 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  a periodic sampl
2fc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  e */.  int nCol;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2ff0: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2b  lumns in index +
3000: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
3010: 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20  mxSample;       
3020: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3030: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
3040: 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  es to accumulate
3050: 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c   */.  Stat4Sampl
3060: 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20  e current;      
3070: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61  /* Current row a
3080: 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20  s a Stat4Sample 
3090: 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20  */.  u32 iPrn;  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  * Pseudo-random 
30c0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
30d0: 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74  sampling */.  St
30e0: 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74  at4Sample *aBest
30f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ;       /* Array
3100: 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61   of nCol best sa
3110: 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  mples */.  int i
3120: 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Min;            
3130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
3140: 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69   a[] of entry wi
3150: 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65  th minimum score
3160: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c   */.  int nSampl
3170: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3180: 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
3190: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a  r of samples */.
31a0: 20 20 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20    int iGet;     
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31c0: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
31d0: 73 61 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20  sample accessed 
31e0: 62 79 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f  by stat_get() */
31f0: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
3200: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
3210: 41 72 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c  Array of mxSampl
3220: 65 20 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62  e Stat4Sample ob
3230: 6a 65 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  jects */.  sqlit
3240: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3250: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72   connection, for
3270: 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a   malloc() */.};.
3280: 0a 2f 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f  ./* Reclaim memo
3290: 72 79 20 75 73 65 64 20 62 79 20 61 20 53 74 61  ry used by a Sta
32a0: 74 34 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64  t4Sample.*/.#ifd
32b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
32c0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
32d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
32e0: 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  leClear(sqlite3 
32f0: 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65  *db, Stat4Sample
3300: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
3310: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
3320: 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->nRowid ){.    
3330: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3340: 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a  , p->u.aRowid);.
3350: 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20      p->nRowid = 
3360: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
3370: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ./* Initialize t
3380: 68 65 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66  he BLOB value of
3390: 20 61 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64   a ROWID.*/.#ifd
33a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
33b0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
33c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
33d0: 6c 65 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74  leSetRowid(sqlit
33e0: 65 33 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d  e3 *db, Stat4Sam
33f0: 70 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63  ple *p, int n, c
3400: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b  onst u8 *pData){
3410: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
3420: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f   );.  if( p->nRo
3430: 77 69 64 20 29 20 73 71 6c 69 74 65 33 44 62 46  wid ) sqlite3DbF
3440: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f  ree(db, p->u.aRo
3450: 77 69 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f  wid);.  p->u.aRo
3460: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  wid = sqlite3DbM
3470: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 29 3b  allocRaw(db, n);
3480: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3490: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
34a0: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
34b0: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
34c0: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
34d0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
34e0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
34f0: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3500: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3510: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3520: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3530: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3540: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
3550: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
3560: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
3570: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3580: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3590: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
35a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
35b0: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
35c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
35d0: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
35e0: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
35f0: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3600: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3610: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3620: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
3630: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
3640: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
3650: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3660: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
3670: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
3680: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3690: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
36a0: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
36b0: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
36c0: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
36d0: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
36e0: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
36f0: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3700: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3710: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3720: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
3730: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
3740: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
3750: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
3760: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
3770: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
3780: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3790: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
37a0: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
37b0: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
37c0: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
37d0: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
37e0: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
37f0: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3800: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3810: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
3830: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
3840: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
3850: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
3860: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
3870: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
3880: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3890: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
38a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
38b0: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
38c0: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
38d0: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
38e0: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
38f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3900: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3910: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3930: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3940: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3950: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3960: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3970: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3980: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3990: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
39a0: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
39b0: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
39c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
39d0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
39e0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
39f0: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3a00: 74 28 4e 2c 43 29 20 53 51 4c 20 66 75 6e 63 74  t(N,C) SQL funct
3a10: 69 6f 6e 2e 20 54 68 65 20 74 77 6f 20 70 61 72  ion. The two par
3a20: 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 20 74  ameters.** are t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
3a40: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  s in the table o
3a50: 72 20 69 6e 64 65 78 20 28 43 29 20 61 6e 64 20  r index (C) and 
3a60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3a70: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
3a80: 69 6e 64 65 78 20 28 4e 29 2e 20 20 54 68 65 20  index (N).  The 
3a90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
3aa0: 28 43 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  (C) is only used
3ab0: 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53   for STAT3 and S
3ac0: 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  TAT4..**.** This
3ad0: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
3ae0: 65 73 20 74 68 65 20 53 74 61 74 34 41 63 63 75  es the Stat4Accu
3af0: 6d 20 6f 62 6a 65 63 74 20 69 6e 20 68 65 61 70  m object in heap
3b00: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72 65 74   memory. The ret
3b10: 75 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20 69 73  urn .** value is
3b20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b30: 65 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d  e the Stat4Accum
3b40: 20 6f 62 6a 65 63 74 20 65 6e 63 6f 64 65 64 20   object encoded 
3b50: 61 73 20 61 20 62 6c 6f 62 20 28 69 2e 65 2e 20  as a blob (i.e. 
3b60: 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20  .** the size of 
3b70: 74 68 65 20 62 6c 6f 62 20 69 73 20 73 69 7a 65  the blob is size
3b80: 6f 66 28 76 6f 69 64 2a 29 20 62 79 74 65 73 29  of(void*) bytes)
3b90: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
3ba0: 64 20 73 74 61 74 49 6e 69 74 28 0a 20 20 73 71  d statInit(.  sq
3bb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3bc0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
3bd0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
3be0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
3bf0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 3b 0a 20  Stat4Accum *p;. 
3c00: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3c30: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 62  lumns in index b
3c40: 65 69 6e 67 20 73 61 6d 70 6c 65 64 20 2a 2f 0a  eing sampled */.
3c50: 20 20 69 6e 74 20 6e 43 6f 6c 55 70 3b 20 20 20    int nColUp;   
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f 75 6e 64 65    /* nCol rounde
3c80: 64 20 75 70 20 66 6f 72 20 61 6c 69 67 6e 6d 65  d up for alignme
3c90: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  nt */.  int n;  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
3cc0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
3cd0: 6f 63 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  ocate */.  sqlit
3ce0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3d00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3d10: 6e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  n */.#ifdef SQLI
3d20: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3d30: 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 6d  OR_STAT4.  int m
3d40: 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49 54 45  xSample = SQLITE
3d50: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 3b 0a  _STAT4_SAMPLES;.
3d60: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 63  #endif..  /* Dec
3d70: 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 66 75  ode the three fu
3d80: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
3d90: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
3da0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
3db0: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  nCol = sqlite3_v
3dc0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
3dd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
3de0: 6c 3e 31 20 29 3b 20 20 20 20 20 20 20 20 20 20  l>1 );          
3df0: 20 20 20 20 20 2f 2a 20 3e 31 20 62 65 63 61 75       /* >1 becau
3e00: 73 65 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  se it includes t
3e10: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
3e20: 2a 2f 0a 20 20 6e 43 6f 6c 55 70 20 3d 20 73 69  */.  nColUp = si
3e30: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 3c 38 20  zeof(tRowcnt)<8 
3e40: 3f 20 28 6e 43 6f 6c 2b 31 29 26 7e 31 20 3a 20  ? (nCol+1)&~1 : 
3e50: 6e 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nCol;..  /* Allo
3e60: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72  cate the space r
3e70: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
3e80: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
3e90: 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f  t */.  n = sizeo
3ea0: 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a  f(*p) .    + siz
3eb0: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
3ec0: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
3ed0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
3ee0: 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b  um.anEq */.    +
3ef0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
3f00: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
3f20: 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a  4Accum.anDLt */.
3f30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3f40: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
3f50: 41 54 34 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66  AT4.    + sizeof
3f60: 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70  (tRowcnt)*nColUp
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e    /* Stat4Accum.
3f90: 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20 73 69  anLt */.    + si
3fa0: 7a 65 6f 66 28 53 74 61 74 34 53 61 6d 70 6c 65  zeof(Stat4Sample
3fb0: 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65  )*(nCol+mxSample
3fc0: 29 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63  )     /* Stat4Ac
3fd0: 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61 5b 5d  cum.aBest[], a[]
3fe0: 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66   */.    + sizeof
3ff0: 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43 6f 6c  (tRowcnt)*3*nCol
4000: 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c  Up*(nCol+mxSampl
4010: 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a 20 20  e).#endif.  ;.  
4020: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
4030: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
4040: 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d 20 73  ontext);.  p = s
4050: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
4060: 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28  ro(db, n);.  if(
4070: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
4080: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4090: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
40a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
40b0: 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  }..  p->db = db;
40c0: 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  .  p->nRow = 0;.
40d0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
40e0: 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ;.  p->current.a
40f0: 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  nDLt = (tRowcnt*
4100: 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 63 75 72  )&p[1];.  p->cur
4110: 72 65 6e 74 2e 61 6e 45 71 20 3d 20 26 70 2d 3e  rent.anEq = &p->
4120: 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 6e 43  current.anDLt[nC
4130: 6f 6c 55 70 5d 3b 0a 0a 23 69 66 64 65 66 20 53  olUp];..#ifdef S
4140: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4150: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 7b 0a  T3_OR_STAT4.  {.
4160: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20      u8 *pSpace; 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
4190: 20 73 70 61 63 65 20 6e 6f 74 20 79 65 74 20 61   space not yet a
41a0: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 69  ssigned */.    i
41b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
41e0: 65 20 74 68 72 6f 75 67 68 20 70 2d 3e 61 53 61  e through p->aSa
41f0: 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70  mple[] */..    p
4200: 2d 3e 69 47 65 74 20 3d 20 2d 31 3b 0a 20 20 20  ->iGet = -1;.   
4210: 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 3d 20 6d   p->mxSample = m
4220: 78 53 61 6d 70 6c 65 3b 0a 20 20 20 20 70 2d 3e  xSample;.    p->
4230: 6e 50 53 61 6d 70 6c 65 20 3d 20 28 74 52 6f 77  nPSample = (tRow
4240: 63 6e 74 29 28 73 71 6c 69 74 65 33 5f 76 61 6c  cnt)(sqlite3_val
4250: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
4260: 29 2f 28 6d 78 53 61 6d 70 6c 65 2f 33 2b 31 29  )/(mxSample/3+1)
4270: 20 2b 20 31 29 3b 0a 20 20 20 20 70 2d 3e 63 75   + 1);.    p->cu
4280: 72 72 65 6e 74 2e 61 6e 4c 74 20 3d 20 26 70 2d  rrent.anLt = &p-
4290: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6e 43  >current.anEq[nC
42a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 69 50  olUp];.    p->iP
42b0: 72 6e 20 3d 20 6e 43 6f 6c 2a 30 78 36 38 39 65  rn = nCol*0x689e
42c0: 39 36 32 64 20 5e 20 73 71 6c 69 74 65 33 5f 76  962d ^ sqlite3_v
42d0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
42e0: 29 2a 30 78 64 30 39 34 34 35 36 35 3b 0a 20 20  )*0xd0944565;.  
42f0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74  .    /* Set up t
4300: 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e 61 5b  he Stat4Accum.a[
4310: 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20 61 72  ] and aBest[] ar
4320: 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d 3e 61  rays */.    p->a
4330: 20 3d 20 28 73 74 72 75 63 74 20 53 74 61 74 34   = (struct Stat4
4340: 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75 72 72  Sample*)&p->curr
4350: 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55 70 5d  ent.anLt[nColUp]
4360: 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74 20 3d  ;.    p->aBest =
4370: 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65 5d   &p->a[mxSample]
4380: 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20 28  ;.    pSpace = (
4390: 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53 61 6d  u8*)(&p->a[mxSam
43a0: 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  ple+nCol]);.    
43b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78 53 61  for(i=0; i<(mxSa
43c0: 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b 2b 29  mple+nCol); i++)
43d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
43e0: 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e 74 20  anEq = (tRowcnt 
43f0: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
4400: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
4410: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
4420: 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e        p->a[i].an
4430: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29  Lt = (tRowcnt *)
4440: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
4450: 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  = (sizeof(tRowcn
4460: 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20  t) * nColUp);.  
4470: 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44 4c      p->a[i].anDL
4480: 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70  t = (tRowcnt *)p
4490: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
44a0: 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74   (sizeof(tRowcnt
44b0: 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20  ) * nColUp);.   
44c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
44d0: 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29 70 29  pSpace - (u8*)p)
44e0: 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20 66 6f  ==n );.  .    fo
44f0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
4500: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 42  ++){.      p->aB
4510: 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20 69 3b  est[i].iCol = i;
4520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
4530: 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  f..  /* Return a
4540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4550: 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
4560: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   to the caller *
4570: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4580: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4590: 20 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 73   p, sizeof(p), s
45a0: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29 3b  tat4Destructor);
45b0: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
45c0: 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74  FuncDef statInit
45d0: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
45e0: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
45f0: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
4600: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
4610: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
4620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4630: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
4640: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4650: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
4660: 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20   statInit,      
4670: 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20    /* xFunc */.  
4680: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4690: 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30   /* xStep */.  0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
46b0: 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a  /* xFinalize */.
46c0: 20 20 22 73 74 61 74 5f 69 6e 69 74 22 2c 20 20    "stat_init",  
46d0: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
46e0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
46f0: 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20    /* pHash */.  
4700: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4710: 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20   /* pDestructor 
4720: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
4730: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4740: 34 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64  4./*.** pNew and
4750: 20 70 4f 6c 64 20 61 72 65 20 62 6f 74 68 20 63   pOld are both c
4760: 61 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72  andidate non-per
4770: 69 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 73 65  iodic samples se
4780: 6c 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74  lected for .** t
4790: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28  he same column (
47a0: 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64  pNew->iCol==pOld
47b0: 2d 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e  ->iCol). Ignorin
47c0: 67 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e  g this column an
47d0: 64 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  d .** considerin
47e0: 67 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c  g only any trail
47f0: 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ing columns and 
4800: 74 68 65 20 73 61 6d 70 6c 65 20 68 61 73 68 20  the sample hash 
4810: 76 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66  value, this.** f
4820: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
4830: 74 72 75 65 20 69 66 20 73 61 6d 70 6c 65 20 70  true if sample p
4840: 4e 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65  New is to be pre
4850: 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64  ferred over pOld
4860: 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
4870: 72 64 73 2c 20 69 66 20 77 65 20 61 73 73 75 6d  rds, if we assum
4880: 65 20 74 68 61 74 20 74 68 65 20 63 61 72 64 69  e that the cardi
4890: 6e 61 6c 69 74 69 65 73 20 6f 66 20 74 68 65 20  nalities of the 
48a0: 73 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75  selected.** colu
48b0: 6d 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e 64 20  mn for pNew and 
48c0: 70 4f 6c 64 20 61 72 65 20 65 71 75 61 6c 2c 20  pOld are equal, 
48d0: 69 73 20 70 4e 65 77 20 74 6f 20 62 65 20 70 72  is pNew to be pr
48e0: 65 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c  eferred over pOl
48f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
4900: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
4910: 68 61 74 20 66 6f 72 20 65 61 63 68 20 61 72 67  hat for each arg
4920: 75 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68  ument sample, th
4930: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a  e contents of.**
4940: 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61   the anEq[] arra
4950: 79 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e  y from pSample->
4960: 61 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43  anEq[pSample->iC
4970: 6f 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20 61 72  ol+1] onwards ar
4980: 65 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61  e valid. .*/.sta
4990: 74 69 63 20 69 6e 74 20 73 61 6d 70 6c 65 49 73  tic int sampleIs
49a0: 42 65 74 74 65 72 50 6f 73 74 28 0a 20 20 53 74  BetterPost(.  St
49b0: 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  at4Accum *pAccum
49c0: 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  , .  Stat4Sample
49d0: 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34   *pNew, .  Stat4
49e0: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a  Sample *pOld.){.
49f0: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63    int nCol = pAc
4a00: 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  cum->nCol;.  int
4a10: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   i;.  assert( pN
4a20: 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e  ew->iCol==pOld->
4a30: 69 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  iCol );.  for(i=
4a40: 70 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c  pNew->iCol+1; i<
4a50: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4a60: 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69  if( pNew->anEq[i
4a70: 5d 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20  ]>pOld->anEq[i] 
4a80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
4a90: 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69  if( pNew->anEq[i
4aa0: 5d 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20  ]<pOld->anEq[i] 
4ab0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
4ac0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 48 61 73    if( pNew->iHas
4ad0: 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20  h>pOld->iHash ) 
4ae0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
4af0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4b00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4b10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
4b20: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
4b30: 20 74 72 75 65 20 69 66 20 70 4e 65 77 20 69 73   true if pNew is
4b40: 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64   to be preferred
4b50: 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a   over pOld..**.*
4b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4b70: 61 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f 72  assumes that for
4b80: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 73   each argument s
4b90: 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65  ample, the conte
4ba0: 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e  nts of.** the an
4bb0: 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d 20  Eq[] array from 
4bc0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53  pSample->anEq[pS
4bd0: 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77  ample->iCol] onw
4be0: 61 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20  ards are valid. 
4bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4c00: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a 20  ampleIsBetter(. 
4c10: 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63   Stat4Accum *pAc
4c20: 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d  cum, .  Stat4Sam
4c30: 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74  ple *pNew, .  St
4c40: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a  at4Sample *pOld.
4c50: 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71  ){.  tRowcnt nEq
4c60: 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71  New = pNew->anEq
4c70: 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20  [pNew->iCol];.  
4c80: 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d  tRowcnt nEqOld =
4c90: 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64   pOld->anEq[pOld
4ca0: 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65  ->iCol];..  asse
4cb0: 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d  rt( pOld->isPSam
4cc0: 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  ple==0 && pNew->
4cd0: 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a  isPSample==0 );.
4ce0: 20 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74    assert( IsStat
4cf0: 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c  4 || (pNew->iCol
4d00: 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f  ==0 && pOld->iCo
4d10: 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20  l==0) );..  if( 
4d20: 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20  (nEqNew>nEqOld) 
4d30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64  ) return 1;.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 6e 45 71  _STAT4.  if( nEq
4d60: 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20  New==nEqOld ){. 
4d70: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f     if( pNew->iCo
4d80: 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72  l<pOld->iCol ) r
4d90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
4da0: 75 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d  urn (pNew->iCol=
4db0: 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73  =pOld->iCol && s
4dc0: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73  ampleIsBetterPos
4dd0: 74 28 70 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20  t(pAccum, pNew, 
4de0: 70 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65  pOld));.  }.  re
4df0: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
4e00: 72 65 74 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d  return (nEqNew==
4e10: 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e  nEqOld && pNew->
4e20: 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73  iHash>pOld->iHas
4e30: 68 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  h);.#endif.}../*
4e40: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  .** Copy the con
4e50: 74 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c 65 20  tents of sample 
4e60: 2a 70 4e 65 77 20 69 6e 74 6f 20 74 68 65 20 70  *pNew into the p
4e70: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ->a[] array. If 
4e80: 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65  necessary,.** re
4e90: 6d 6f 76 65 20 74 68 65 20 6c 65 61 73 74 20 64  move the least d
4ea0: 65 73 69 72 61 62 6c 65 20 73 61 6d 70 6c 65 20  esirable sample 
4eb0: 66 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d  from p->a[] to m
4ec0: 61 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61  ake room..*/.sta
4ed0: 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 49  tic void sampleI
4ee0: 6e 73 65 72 74 28 53 74 61 74 34 41 63 63 75 6d  nsert(Stat4Accum
4ef0: 20 2a 70 2c 20 53 74 61 74 34 53 61 6d 70 6c 65   *p, Stat4Sample
4f00: 20 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a   *pNew, int nEqZ
4f10: 65 72 6f 29 7b 0a 20 20 53 74 61 74 34 53 61 6d  ero){.  Stat4Sam
4f20: 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30  ple *pSample = 0
4f30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
4f40: 73 65 72 74 28 20 49 73 53 74 61 74 34 20 7c 7c  sert( IsStat4 ||
4f50: 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a   nEqZero==0 );..
4f60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4f70: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28  ABLE_STAT4.  if(
4f80: 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65   pNew->isPSample
4f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 74 34  ==0 ){.    Stat4
4fa0: 53 61 6d 70 6c 65 20 2a 70 55 70 67 72 61 64 65  Sample *pUpgrade
4fb0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
4fc0: 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65  ( pNew->anEq[pNe
4fd0: 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20  w->iCol]>0 );.. 
4fe0: 20 20 20 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c     /* This sampl
4ff0: 65 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64  e is being added
5000: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72 65   because the pre
5010: 66 69 78 20 74 68 61 74 20 65 6e 64 73 20 69 6e  fix that ends in
5020: 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20   column .    ** 
5030: 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79  iCol occurs many
5040: 20 74 69 6d 65 73 20 69 6e 20 74 68 65 20 74 61   times in the ta
5050: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ble. However, if
5060: 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
5070: 0a 20 20 20 20 2a 2a 20 61 64 64 65 64 20 61 20  .    ** added a 
5080: 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72  sample that shar
5090: 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2c 20  es this prefix, 
50a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
50b0: 20 74 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20 74   to add.    ** t
50c0: 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64  his one. Instead
50d0: 2c 20 75 70 67 72 61 64 65 20 74 68 65 20 70 72  , upgrade the pr
50e0: 69 6f 72 69 74 79 20 6f 66 20 74 68 65 20 68 69  iority of the hi
50f0: 67 68 65 73 74 20 70 72 69 6f 72 69 74 79 0a 20  ghest priority. 
5100: 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 73     ** existing s
5110: 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72 65  ample that share
5120: 73 20 74 68 69 73 20 70 72 65 66 69 78 2e 20 20  s this prefix.  
5130: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  */.    for(i=p->
5140: 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b  nSample-1; i>=0;
5150: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74 61   i--){.      Sta
5160: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d  t4Sample *pOld =
5170: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20   &p->a[i];.     
5180: 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b   if( pOld->anEq[
5190: 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29  pNew->iCol]==0 )
51a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
51b0: 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29 20  ld->isPSample ) 
51c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
51d0: 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43  assert( pOld->iC
51e0: 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b  ol>pNew->iCol );
51f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5200: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5210: 70 2c 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29  p, pNew, pOld) )
5220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 55  ;.        if( pU
5230: 70 67 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d  pgrade==0 || sam
5240: 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20 70  pleIsBetter(p, p
5250: 4f 6c 64 2c 20 70 55 70 67 72 61 64 65 29 20 29  Old, pUpgrade) )
5260: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 67  {.          pUpg
5270: 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  rade = pOld;.   
5280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5290: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70     }.    if( pUp
52a0: 67 72 61 64 65 20 29 7b 0a 20 20 20 20 20 20 70  grade ){.      p
52b0: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20  Upgrade->iCol = 
52c0: 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20  pNew->iCol;.    
52d0: 20 20 70 55 70 67 72 61 64 65 2d 3e 61 6e 45 71    pUpgrade->anEq
52e0: 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d  [pUpgrade->iCol]
52f0: 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55   = pNew->anEq[pU
5300: 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20  pgrade->iCol];. 
5310: 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e       goto find_n
5320: 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  ew_min;.    }.  
5330: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
5340: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d  f necessary, rem
5350: 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20  ove sample iMin 
5360: 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
5370: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e   the new sample.
5380: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61   */.  if( p->nSa
5390: 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c  mple>=p->mxSampl
53a0: 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  e ){.    Stat4Sa
53b0: 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d  mple *pMin = &p-
53c0: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20  >a[p->iMin];.   
53d0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d   tRowcnt *anEq =
53e0: 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20   pMin->anEq;.   
53f0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d   tRowcnt *anLt =
5400: 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20   pMin->anLt;.   
5410: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20   tRowcnt *anDLt 
5420: 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20  = pMin->anDLt;. 
5430: 20 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70     sampleClear(p
5440: 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20  ->db, pMin);.   
5450: 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26   memmove(pMin, &
5460: 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28  pMin[1], sizeof(
5470: 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61  p->a[0])*(p->nSa
5480: 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29  mple-p->iMin-1))
5490: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  ;.    pSample = 
54a0: 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65  &p->a[p->nSample
54b0: 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  -1];.    pSample
54c0: 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->nRowid = 0;.  
54d0: 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20    pSample->anEq 
54e0: 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d  = anEq;.    pSam
54f0: 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44  ple->anDLt = anD
5500: 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  Lt;.    pSample-
5510: 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20  >anLt = anLt;.  
5520: 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70    p->nSample = p
5530: 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20  ->mxSample-1;.  
5540: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77  }..  /* The "row
5550: 73 20 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72  s less-than" for
5560: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
5570: 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  n must be greate
5580: 72 20 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a  r than that.  **
5590: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61   for the last sa
55a0: 6d 70 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61  mple in the p->a
55b0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
55c0: 69 73 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73  ise, the samples
55d0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f   would.  ** be o
55e0: 75 74 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a  ut of order. */.
55f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5600: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 61 73 73  ABLE_STAT4.  ass
5610: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d  ert( p->nSample=
5620: 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  =0 .       || pN
5630: 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c  ew->anLt[p->nCol
5640: 2d 31 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53  -1] > p->a[p->nS
5650: 61 6d 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d  ample-1].anLt[p-
5660: 3e 6e 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64  >nCol-1] );.#end
5670: 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  if..  /* Insert 
5680: 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a  the new sample *
5690: 2f 0a 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70  /.  pSample = &p
56a0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b  ->a[p->nSample];
56b0: 0a 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c  .  sampleCopy(p,
56c0: 20 70 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b   pSample, pNew);
56d0: 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b  .  p->nSample++;
56e0: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
56f0: 66 69 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e  first nEqZero en
5700: 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45  tries in the anE
5710: 71 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  q[] array. */.  
5720: 6d 65 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e  memset(pSample->
5730: 61 6e 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28  anEq, 0, sizeof(
5740: 74 52 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f  tRowcnt)*nEqZero
5750: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
5760: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
5770: 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65  find_new_min:.#e
5780: 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53  ndif.  if( p->nS
5790: 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70  ample>=p->mxSamp
57a0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  le ){.    int iM
57b0: 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  in = -1;.    for
57c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d  (i=0; i<p->mxSam
57d0: 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
57e0: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50   if( p->a[i].isP
57f0: 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75  Sample ) continu
5800: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69  e;.      if( iMi
5810: 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42  n<0 || sampleIsB
5820: 65 74 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69  etter(p, &p->a[i
5830: 4d 69 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20  Min], &p->a[i]) 
5840: 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20  ){.        iMin 
5850: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
5860: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
5870: 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d  Min>=0 );.    p-
5880: 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20  >iMin = iMin;.  
5890: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
58a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
58b0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
58c0: 2a 0a 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e 67  *.** Field iChng
58d0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
58e0: 69 6e 67 20 73 63 61 6e 6e 65 64 20 68 61 73 20  ing scanned has 
58f0: 63 68 61 6e 67 65 64 2e 20 53 6f 20 61 74 20 74  changed. So at t
5900: 68 69 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e  his point.** p->
5910: 63 75 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73  current contains
5920: 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20 72   a sample that r
5930: 65 66 6c 65 63 74 73 20 74 68 65 20 70 72 65 76  eflects the prev
5940: 69 6f 75 73 20 72 6f 77 20 6f 66 20 74 68 65 0a  ious row of the.
5950: 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 76 61  ** index. The va
5960: 6c 75 65 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e  lue of anEq[iChn
5970: 67 5d 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  g] and subsequen
5980: 74 20 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74  t anEq[] element
5990: 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74  s are.** correct
59a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
59b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
59c0: 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75  amplePushPreviou
59d0: 73 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  s(Stat4Accum *p,
59e0: 20 69 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69 66   int iChng){.#if
59f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5a00: 45 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 69 3b  E_STAT4.  int i;
5a10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
5a20: 61 6e 79 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d  any samples from
5a30: 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72   the aBest[] arr
5a40: 61 79 20 73 68 6f 75 6c 64 20 62 65 20 70 75 73  ay should be pus
5a50: 68 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e  hed.  ** into In
5a60: 64 65 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74  dexSample.a[] at
5a70: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f   this point.  */
5a80: 0a 20 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f  .  for(i=(p->nCo
5a90: 6c 2d 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20  l-2); i>=iChng; 
5aa0: 69 2d 2d 29 7b 0a 20 20 20 20 53 74 61 74 34 53  i--){.    Stat4S
5ab0: 61 6d 70 6c 65 20 2a 70 42 65 73 74 20 3d 20 26  ample *pBest = &
5ac0: 70 2d 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20  p->aBest[i];.   
5ad0: 20 70 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20   pBest->anEq[i] 
5ae0: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
5af0: 71 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  q[i];.    if( p-
5b00: 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61  >nSample<p->mxSa
5b10: 6d 70 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73  mple || sampleIs
5b20: 42 65 74 74 65 72 28 70 2c 20 70 42 65 73 74 2c  Better(p, pBest,
5b30: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
5b40: 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65   ){.      sample
5b50: 49 6e 73 65 72 74 28 70 2c 20 70 42 65 73 74 2c  Insert(p, pBest,
5b60: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i);.    }.  }..
5b70: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
5b80: 61 6e 45 71 5b 5d 20 66 69 65 6c 64 73 20 6f 66  anEq[] fields of
5b90: 20 61 6e 79 20 73 61 6d 70 6c 65 73 20 61 6c 72   any samples alr
5ba0: 65 61 64 79 20 63 6f 6c 6c 65 63 74 65 64 2e 20  eady collected. 
5bb0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  */.  for(i=p->nS
5bc0: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
5bd0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  --){.    int j;.
5be0: 20 20 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b      for(j=iChng;
5bf0: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
5c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
5c10: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29  [i].anEq[j]==0 )
5c20: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
5c30: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
5c40: 45 71 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Eq[j];.    }.  }
5c50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
5c60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5c70: 4c 45 5f 53 54 41 54 33 29 20 26 26 20 21 64 65  LE_STAT3) && !de
5c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
5c90: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 69 66 28  BLE_STAT4).  if(
5ca0: 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20   iChng==0 ){.   
5cb0: 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70   tRowcnt nLt = p
5cc0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30  ->current.anLt[0
5cd0: 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ];.    tRowcnt n
5ce0: 45 71 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Eq = p->current.
5cf0: 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  anEq[0];..    /*
5d00: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
5d10: 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f 64  s to be a period
5d20: 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f  ic sample. If so
5d30: 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20  , add it. */.   
5d40: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
5d50: 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71  ample)!=(nLt+nEq
5d60: 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b  )/p->nPSample ){
5d70: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
5d80: 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  t.isPSample = 1;
5d90: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
5da0: 65 72 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ert(p, &p->curre
5db0: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  nt, 0);.      p-
5dc0: 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70  >current.isPSamp
5dd0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
5de0: 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66  e ..    /* Or if
5df0: 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72   it is a non-per
5e00: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 41 64  iodic sample. Ad
5e10: 64 20 69 74 20 69 6e 20 74 68 69 73 20 63 61 73  d it in this cas
5e20: 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66  e too. */.    if
5e30: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
5e40: 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c  mxSample .     |
5e50: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
5e60: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
5e70: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29   &p->a[p->iMin])
5e80: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
5e90: 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26  ampleInsert(p, &
5ea0: 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a  p->current, 0);.
5eb0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5ec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5ed0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
5ee0: 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45 44 5f  _STAT4.  UNUSED_
5ef0: 50 41 52 41 4d 45 54 45 52 28 20 70 20 29 3b 0a  PARAMETER( p );.
5f00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5f10: 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e  ER( iChng );.#en
5f20: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  dif.}../*.** Imp
5f30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5f40: 68 65 20 73 74 61 74 5f 70 75 73 68 20 53 51 4c  he stat_push SQL
5f50: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74   function:  stat
5f60: 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20  _push(P,C,R).** 
5f70: 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  Arguments:.**.**
5f80: 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e 74 65      P     Pointe
5f90: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
5fa0: 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65 61 74  cum object creat
5fb0: 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69 74 28  ed by stat_init(
5fc0: 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20 49 6e  ).**    C     In
5fd0: 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  dex of left-most
5fe0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65   column to diffe
5ff0: 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  r from previous 
6000: 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20 20 20  row.**    R     
6010: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  Rowid for the cu
6020: 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68  rrent row.  Migh
6030: 74 20 62 65 20 61 20 6b 65 79 20 72 65 63 6f 72  t be a key recor
6040: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
6050: 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20    WITHOUT ROWID 
6060: 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
6070: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  e SQL function a
6080: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55  lways returns NU
6090: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 20  LL..**.** The R 
60a0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c  parameter is onl
60b0: 79 20 75 73 65 64 20 66 6f 72 20 53 54 41 54 33  y used for STAT3
60c0: 20 61 6e 64 20 53 54 41 54 34 0a 2a 2f 0a 73 74   and STAT4.*/.st
60d0: 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 50 75  atic void statPu
60e0: 73 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  sh(.  sqlite3_co
60f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6100: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6110: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6120: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  gv.){.  int i;..
6130: 20 20 2f 2a 20 54 68 65 20 74 68 72 65 65 20 66    /* The three f
6140: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
6150: 73 20 2a 2f 0a 20 20 53 74 61 74 34 41 63 63 75  s */.  Stat4Accu
6160: 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63  m *p = (Stat4Acc
6170: 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  um*)sqlite3_valu
6180: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6190: 0a 20 20 69 6e 74 20 69 43 68 6e 67 20 3d 20 73  .  int iChng = s
61a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
61b0: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e  (argv[1]);..  UN
61c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
61d0: 61 72 67 63 20 29 3b 0a 20 20 55 4e 55 53 45 44  argc );.  UNUSED
61e0: 5f 50 41 52 41 4d 45 54 45 52 28 20 63 6f 6e 74  _PARAMETER( cont
61f0: 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ext );.  assert(
6200: 20 70 2d 3e 6e 43 6f 6c 3e 31 20 29 3b 20 20 20   p->nCol>1 );   
6210: 20 20 20 20 20 2f 2a 20 49 6e 63 6c 75 64 65 73       /* Includes
6220: 20 72 6f 77 69 64 20 66 69 65 6c 64 20 2a 2f 0a   rowid field */.
6230: 20 20 61 73 73 65 72 74 28 20 69 43 68 6e 67 3c    assert( iChng<
6240: 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69 66  p->nCol );..  if
6250: 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b 0a  ( p->nRow==0 ){.
6260: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6270: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
6280: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6290: 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  Do initializatio
62a0: 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  n. */.    for(i=
62b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
62c0: 2b 29 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  +) p->current.an
62d0: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 65 6c  Eq[i] = 1;.  }el
62e0: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e  se{.    /* Secon
62f0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
6300: 20 63 61 6c 6c 73 20 67 65 74 20 70 72 6f 63 65   calls get proce
6310: 73 73 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 20  ssed here */.   
6320: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
6330: 6f 75 73 28 70 2c 20 69 43 68 6e 67 29 3b 0a 0a  ous(p, iChng);..
6340: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
6350: 44 4c 74 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61 6e  DLt[], anLt[] an
6360: 64 20 61 6e 45 71 5b 5d 20 74 6f 20 72 65 66 6c  d anEq[] to refl
6370: 65 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  ect the values t
6380: 68 61 74 20 61 70 70 6c 79 0a 20 20 20 20 2a 2a  hat apply.    **
6390: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
63a0: 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 64 65 78  row of the index
63b0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
63c0: 3b 20 69 3c 69 43 68 6e 67 3b 20 69 2b 2b 29 7b  ; i<iChng; i++){
63d0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
63e0: 74 2e 61 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20 20  t.anEq[i]++;.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 43 68   }.    for(i=iCh
6400: 6e 67 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  ng; i<p->nCol; i
6410: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75  ++){.      p->cu
6420: 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b 2b  rrent.anDLt[i]++
6430: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6440: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
6450: 53 54 41 54 34 0a 20 20 20 20 20 20 70 2d 3e 63  STAT4.      p->c
6460: 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20 2b  urrent.anLt[i] +
6470: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
6480: 71 5b 69 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  q[i];.#endif.   
6490: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
64a0: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  Eq[i] = 1;.    }
64b0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b  .  }.  p->nRow++
64c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
64d0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
64e0: 53 54 41 54 34 0a 20 20 69 66 28 20 73 71 6c 69  STAT4.  if( sqli
64f0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
6500: 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[2])==SQLITE_
6510: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 73  INTEGER ){.    s
6520: 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 49 6e 74  ampleSetRowidInt
6530: 36 34 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75  64(p->db, &p->cu
6540: 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76  rrent, sqlite3_v
6550: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
6560: 32 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2]));.  }else{. 
6570: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
6580: 64 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  d(p->db, &p->cur
6590: 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  rent, sqlite3_va
65a0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32  lue_bytes(argv[2
65b0: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
65e0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
65f0: 67 76 5b 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70  gv[2]));.  }.  p
6600: 2d 3e 63 75 72 72 65 6e 74 2e 69 48 61 73 68 20  ->current.iHash 
6610: 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69  = p->iPrn = p->i
6620: 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b  Prn*1103515245 +
6630: 20 31 32 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a   12345;.#endif..
6640: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6650: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20  ABLE_STAT4.  {. 
6660: 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d     tRowcnt nLt =
6670: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74   p->current.anLt
6680: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20  [p->nCol-1];..  
6690: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
66a0: 69 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65  is is to be a pe
66b0: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49  riodic sample. I
66c0: 66 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f  f so, add it. */
66d0: 0a 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d  .    if( (nLt/p-
66e0: 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74  >nPSample)!=(nLt
66f0: 2b 31 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20  +1)/p->nPSample 
6700: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
6710: 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20  ent.isPSample = 
6720: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  1;.      p->curr
6730: 65 6e 74 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ent.iCol = 0;.  
6740: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6750: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
6760: 20 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20   p->nCol-1);.   
6770: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6780: 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20  PSample = 0;.   
6790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
67a0: 65 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  e the aBest[] ar
67b0: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ray. */.    for(
67c0: 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d  i=0; i<(p->nCol-
67d0: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
67e0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
67f0: 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = i;.      if( i
6800: 3e 3d 69 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c  >=iChng || sampl
6810: 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70 2c  eIsBetterPost(p,
6820: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70   &p->current, &p
6830: 2d 3e 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20  ->aBest[i]) ){. 
6840: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70         sampleCop
6850: 79 28 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  y(p, &p->aBest[i
6860: 5d 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b  ], &p->current);
6870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6880: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74   }.#endif.}.stat
6890: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
68a0: 20 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66   statPushFuncdef
68b0: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33   = {.  2+IsStat3
68c0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
68d0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
68e0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
68f0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
6900: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
6910: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
6930: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75  Next */.  statPu
6940: 73 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46  sh,        /* xF
6950: 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  unc */.  0,     
6960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74            /* xSt
6970: 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ep */.  0,      
6980: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
6990: 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74  alize */.  "stat
69a0: 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a  _push",     /* z
69b0: 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Name */.  0,    
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 48             /* pH
69d0: 61 73 68 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ash */.  0      
69e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65            /* pDe
69f0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a  structor */.};..
6a00: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
6a10: 5f 53 54 41 54 31 20 30 20 20 20 20 20 20 20 20  _STAT1 0        
6a20: 20 20 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c 75    /* "stat" colu
6a30: 6d 6e 20 6f 66 20 73 74 61 74 31 20 74 61 62 6c  mn of stat1 tabl
6a40: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41  e */.#define STA
6a50: 54 5f 47 45 54 5f 52 4f 57 49 44 20 31 20 20 20  T_GET_ROWID 1   
6a60: 20 20 20 20 20 20 20 2f 2a 20 22 72 6f 77 69 64         /* "rowid
6a70: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74  " column of stat
6a80: 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64  [34] entry */.#d
6a90: 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e  efine STAT_GET_N
6aa0: 45 51 20 20 20 32 20 20 20 20 20 20 20 20 20 20  EQ   2          
6ab0: 2f 2a 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e 20  /* "neq" column 
6ac0: 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72  of stat[34] entr
6ad0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41  y */.#define STA
6ae0: 54 5f 47 45 54 5f 4e 4c 54 20 20 20 33 20 20 20  T_GET_NLT   3   
6af0: 20 20 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22 20         /* "nlt" 
6b00: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
6b10: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
6b20: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c  ine STAT_GET_NDL
6b30: 54 20 20 34 20 20 20 20 20 20 20 20 20 20 2f 2a  T  4          /*
6b40: 20 22 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f   "ndlt" column o
6b50: 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79  f stat[34] entry
6b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
6b70: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6b80: 20 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 53   stat_get(P,J) S
6b90: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
6ba0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6bb0: 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 74   used to query t
6bc0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e  he results.  Con
6bd0: 74 65 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64  tent is returned
6be0: 20 66 6f 72 20 70 61 72 61 6d 65 74 65 72 20 4a   for parameter J
6bf0: 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 65  .** which is one
6c00: 20 6f 66 20 74 68 65 20 53 54 41 54 5f 47 45 54   of the STAT_GET
6c10: 5f 78 78 78 78 20 76 61 6c 75 65 73 20 64 65 66  _xxxx values def
6c20: 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
6c30: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 53 54 41  * If neither STA
6c40: 54 33 20 6e 6f 72 20 53 54 41 54 34 20 61 72 65  T3 nor STAT4 are
6c50: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a   enabled, then J
6c60: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54   is always.** ST
6c70: 41 54 5f 47 45 54 5f 53 54 41 54 31 20 61 6e 64  AT_GET_STAT1 and
6c80: 20 69 73 20 68 65 6e 63 65 20 6f 6d 69 74 74 65   is hence omitte
6c90: 64 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  d and this routi
6ca0: 6e 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  ne becomes.** a 
6cb0: 6f 6e 65 2d 70 61 72 61 6d 65 74 65 72 20 66 75  one-parameter fu
6cc0: 6e 63 74 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74  nction, stat_get
6cd0: 28 50 29 2c 20 74 68 61 74 20 61 6c 77 61 79 73  (P), that always
6ce0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
6cf0: 73 74 61 74 31 20 74 61 62 6c 65 20 65 6e 74 72  stat1 table entr
6d00: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  y information..*
6d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
6d20: 61 74 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33  atGet(.  sqlite3
6d30: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6d40: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6d50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6d60: 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 34  *argv.){.  Stat4
6d70: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
6d80: 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  4Accum*)sqlite3_
6d90: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6da0: 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0]);.#ifdef SQLI
6db0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
6dc0: 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 54  OR_STAT4.  /* ST
6dd0: 41 54 33 20 61 6e 64 20 53 54 41 54 34 20 68 61  AT3 and STAT4 ha
6de0: 76 65 20 61 20 70 61 72 61 6d 65 74 65 72 20 6f  ve a parameter o
6df0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  n this routine. 
6e00: 2a 2f 0a 20 20 69 6e 74 20 65 43 61 6c 6c 20 3d  */.  int eCall =
6e10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6e20: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61  nt(argv[1]);.  a
6e30: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29  ssert( argc==2 )
6e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43 61 6c  ;.  assert( eCal
6e50: 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54  l==STAT_GET_STAT
6e60: 31 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54  1 || eCall==STAT
6e70: 5f 47 45 54 5f 4e 45 51 20 0a 20 20 20 20 20 20  _GET_NEQ .      
6e80: 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f   || eCall==STAT_
6e90: 47 45 54 5f 52 4f 57 49 44 20 7c 7c 20 65 43 61  GET_ROWID || eCa
6ea0: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 4c 54  ll==STAT_GET_NLT
6eb0: 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c  .       || eCall
6ec0: 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20  ==STAT_GET_NDLT 
6ed0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 65 43 61 6c  .  );.  if( eCal
6ee0: 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54  l==STAT_GET_STAT
6ef0: 31 20 29 0a 23 65 6c 73 65 0a 20 20 61 73 73 65  1 ).#else.  asse
6f00: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 23  rt( argc==1 );.#
6f10: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 2f 2a  endif.  {.    /*
6f20: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
6f30: 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68  e to store in th
6f40: 65 20 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20  e "stat" column 
6f50: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
6f60: 61 74 31 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  at1.    ** table
6f70: 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e   for this index.
6f80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6f90: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  he value is a st
6fa0: 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66  ring composed of
6fb0: 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67   a list of integ
6fc0: 65 72 73 20 64 65 73 63 72 69 62 69 6e 67 20 0a  ers describing .
6fd0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
6fe0: 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  . The first inte
6ff0: 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ger in the list 
7000: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
7010: 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20 65  ber of .    ** e
7020: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e  ntries in the in
7030: 64 65 78 2e 20 54 68 65 72 65 20 69 73 20 6f 6e  dex. There is on
7040: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74  e additional int
7050: 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  eger in the list
7060: 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63   .    ** for eac
7070: 68 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  h indexed column
7080: 2e 20 54 68 69 73 20 61 64 64 69 74 69 6f 6e 61  . This additiona
7090: 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61 6e 20  l integer is an 
70a0: 65 73 74 69 6d 61 74 65 20 6f 66 0a 20 20 20 20  estimate of.    
70b0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
70c0: 20 72 6f 77 73 20 6d 61 74 63 68 65 64 20 62 79   rows matched by
70d0: 20 61 20 73 74 61 62 62 69 6e 67 20 71 75 65 72   a stabbing quer
70e0: 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 75  y on the index u
70f0: 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 6b 65  sing.    ** a ke
7100: 79 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  y with the corre
7110: 73 70 6f 6e 64 69 6e 67 20 6e 75 6d 62 65 72 20  sponding number 
7120: 6f 66 20 66 69 65 6c 64 73 2e 20 49 6e 20 6f 74  of fields. In ot
7130: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 2a  her words,.    *
7140: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  * if the index i
7150: 73 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28 61 2c  s on columns (a,
7160: 62 29 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  b) and the sqlit
7170: 65 5f 73 74 61 74 31 20 76 61 6c 75 65 20 69 73  e_stat1 value is
7180: 20 0a 20 20 20 20 2a 2a 20 22 31 30 30 20 31 30   .    ** "100 10
7190: 20 32 22 2c 20 74 68 65 6e 20 53 51 4c 69 74 65   2", then SQLite
71a0: 20 65 73 74 69 6d 61 74 65 73 20 74 68 61 74 3a   estimates that:
71b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
71c0: 20 2a 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e   * the index con
71d0: 74 61 69 6e 73 20 31 30 30 20 72 6f 77 73 2c 0a  tains 100 rows,.
71e0: 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52      **   * "WHER
71f0: 45 20 61 3d 3f 22 20 6d 61 74 63 68 65 73 20 31  E a=?" matches 1
7200: 30 20 72 6f 77 73 2c 20 61 6e 64 0a 20 20 20 20  0 rows, and.    
7210: 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20 61 3d  **   * "WHERE a=
7220: 3f 20 41 4e 44 20 62 3d 3f 22 20 6d 61 74 63 68  ? AND b=?" match
7230: 65 73 20 32 20 72 6f 77 73 2e 0a 20 20 20 20 2a  es 2 rows..    *
7240: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 44 20 69 73  *.    ** If D is
7250: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69   the count of di
7260: 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 61 6e  stinct values an
7270: 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74 61 6c  d K is the total
7280: 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
7290: 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 65 61  ** rows, then ea
72a0: 63 68 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  ch estimate is c
72b0: 6f 6d 70 75 74 65 64 20 61 73 3a 0a 20 20 20 20  omputed as:.    
72c0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
72d0: 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20   I = (K+D-1)/D. 
72e0: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
72f0: 7a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  z;.    int i;.. 
7300: 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20     char *zRet = 
7310: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
7320: 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b  o(p->nCol * 25);
7330: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
7340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7350: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7360: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
7370: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7380: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
7390: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65  snprintf(24, zRe
73a0: 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75 36 34 29  t, "%llu", (u64)
73b0: 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 7a 20  p->nRow);.    z 
73c0: 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69 74 65 33  = zRet + sqlite3
73d0: 53 74 72 6c 65 6e 33 30 28 7a 52 65 74 29 3b 0a  Strlen30(zRet);.
73e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
73f0: 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29  p->nCol-1); i++)
7400: 7b 0a 20 20 20 20 20 20 75 36 34 20 6e 44 69 73  {.      u64 nDis
7410: 74 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72 72 65  tinct = p->curre
7420: 6e 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20 31 3b  nt.anDLt[i] + 1;
7430: 0a 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20  .      u64 iVal 
7440: 3d 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e 44 69  = (p->nRow + nDi
7450: 73 74 69 6e 63 74 20 2d 20 31 29 20 2f 20 6e 44  stinct - 1) / nD
7460: 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 73  istinct;.      s
7470: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7480: 32 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22 2c 20  24, z, " %llu", 
7490: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 20 2b  iVal);.      z +
74a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
74b0: 30 28 7a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  0(z);.      asse
74c0: 72 74 28 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  rt( p->current.a
74d0: 6e 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20 7d 0a  nEq[i] );.    }.
74e0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
74f0: 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74  =='\0' && z>zRet
7500: 20 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   );..    sqlite3
7510: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7520: 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20  text, zRet, -1, 
7530: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
7540: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7550: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
7560: 5f 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66  _STAT4.  else if
7570: 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  ( eCall==STAT_GE
7580: 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 69  T_ROWID ){.    i
7590: 66 28 20 70 2d 3e 69 47 65 74 3c 30 20 29 7b 0a  f( p->iGet<0 ){.
75a0: 20 20 20 20 20 20 73 61 6d 70 6c 65 50 75 73 68        samplePush
75b0: 50 72 65 76 69 6f 75 73 28 70 2c 20 30 29 3b 0a  Previous(p, 0);.
75c0: 20 20 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20        p->iGet = 
75d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
75e0: 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d   p->iGet<p->nSam
75f0: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ple ){.      Sta
7600: 74 34 53 61 6d 70 6c 65 20 2a 70 53 20 3d 20 70  t4Sample *pS = p
7610: 2d 3e 61 20 2b 20 70 2d 3e 69 47 65 74 3b 0a 20  ->a + p->iGet;. 
7620: 20 20 20 20 20 69 66 28 20 70 53 2d 3e 6e 52 6f       if( pS->nRo
7630: 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wid==0 ){.      
7640: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7650: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
7660: 70 53 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20  pS->u.iRowid);. 
7670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7680: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7690: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
76a0: 20 70 53 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70   pS->u.aRowid, p
76b0: 53 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20 20 20 20  S->nRowid,.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
76e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
76f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
7700: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 43  .    tRowcnt *aC
7710: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  nt = 0;..    ass
7720: 65 72 74 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e  ert( p->iGet<p->
7730: 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 73  nSample );.    s
7740: 77 69 74 63 68 28 20 65 43 61 6c 6c 20 29 7b 0a  witch( eCall ){.
7750: 20 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f        case STAT_
7760: 47 45 54 5f 4e 45 51 3a 20 20 61 43 6e 74 20 3d  GET_NEQ:  aCnt =
7770: 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61   p->a[p->iGet].a
7780: 6e 45 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  nEq; break;.    
7790: 20 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f    case STAT_GET_
77a0: 4e 4c 54 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e  NLT:  aCnt = p->
77b0: 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 4c 74 3b  a[p->iGet].anLt;
77c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
77d0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
77e0: 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e   aCnt = p->a[p->
77f0: 69 47 65 74 5d 2e 61 6e 44 4c 74 3b 20 0a 20 20  iGet].anDLt; .  
7800: 20 20 20 20 20 20 70 2d 3e 69 47 65 74 2b 2b 3b        p->iGet++;
7810: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7830: 20 20 20 69 66 28 20 49 73 53 74 61 74 33 20 29     if( IsStat3 )
7840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7850: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
7860: 74 65 78 74 2c 20 28 69 36 34 29 61 43 6e 74 5b  text, (i64)aCnt[
7870: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
7880: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74        char *zRet
7890: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
78a0: 5a 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32  Zero(p->nCol * 2
78b0: 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  5);.      if( zR
78c0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
78d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
78e0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
78f0: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
7900: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
7910: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
7920: 7a 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20  z = zRet;.      
7930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7940: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7960: 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25  printf(24, z, "%
7970: 6c 6c 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74  llu ", (u64)aCnt
7980: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
7990: 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
79a0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20  en30(z);.       
79b0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
79c0: 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26  t( z[0]=='\0' &&
79d0: 20 7a 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20   z>zRet );.     
79e0: 20 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b     z[-1] = '\0';
79f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7a00: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7a10: 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20  text, zRet, -1, 
7a20: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
7a30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7a50: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
7a60: 52 5f 53 54 41 54 34 20 2a 2f 0a 23 69 66 6e 64  R_STAT4 */.#ifnd
7a70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7a80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7a90: 45 52 28 20 61 72 67 63 20 29 3b 0a 23 65 6e 64  ER( argc );.#end
7aa0: 69 66 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73  if.}.static cons
7ab0: 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 47 65  t FuncDef statGe
7ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31  tFuncdef = {.  1
7ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
7ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
7af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
7b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
7b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
7b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
7b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
7b50: 20 20 73 74 61 74 47 65 74 2c 20 20 20 20 20 20    statGet,      
7b60: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
7b70: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7b80: 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20    /* xStep */.  
7b90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7ba0: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
7bb0: 0a 20 20 22 73 74 61 74 5f 67 65 74 22 2c 20 20  .  "stat_get",  
7bc0: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
7bd0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7be0: 20 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20     /* pHash */. 
7bf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7c00: 20 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72    /* pDestructor
7c10: 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76   */.};..static v
7c20: 6f 69 64 20 63 61 6c 6c 53 74 61 74 47 65 74 28  oid callStatGet(
7c30: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67  Vdbe *v, int reg
7c40: 53 74 61 74 34 2c 20 69 6e 74 20 69 50 61 72 61  Stat4, int iPara
7c50: 6d 2c 20 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a  m, int regOut){.
7c60: 20 20 61 73 73 65 72 74 28 20 72 65 67 4f 75 74    assert( regOut
7c70: 21 3d 72 65 67 53 74 61 74 34 20 26 26 20 72 65  !=regStat4 && re
7c80: 67 4f 75 74 21 3d 72 65 67 53 74 61 74 34 2b 31  gOut!=regStat4+1
7c90: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
7ca0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
7cb0: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
7cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7cd0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 50 61 72 61  P_Integer, iPara
7ce0: 6d 2c 20 72 65 67 53 74 61 74 34 2b 31 29 3b 0a  m, regStat4+1);.
7cf0: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 44 45 42  #elif SQLITE_DEB
7d00: 55 47 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  UG.  assert( iPa
7d10: 72 61 6d 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  ram==STAT_GET_ST
7d20: 41 54 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  AT1 );.#else.  U
7d30: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7d40: 20 69 50 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69   iParam );.#endi
7d50: 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
7d60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp3(v, OP_Func
7d70: 74 69 6f 6e 2c 20 30 2c 20 72 65 67 53 74 61 74  tion, 0, regStat
7d80: 34 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 73 71  4, regOut);.  sq
7d90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7da0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
7db0: 26 73 74 61 74 47 65 74 46 75 6e 63 64 65 66 2c  &statGetFuncdef,
7dc0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
7dd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7de0: 65 50 35 28 76 2c 20 31 20 2b 20 49 73 53 74 61  eP5(v, 1 + IsSta
7df0: 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  t34);.}../*.** G
7e00: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
7e10: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
7e20: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  f all indices as
7e30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
7e40: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
7e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e60: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
7e70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7e80: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
7e90: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
7ea0: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
7eb0: 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63  able whose indic
7ec0: 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61  es are to be ana
7ed0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
7ee0: 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49   *pOnlyIdx, /* I
7ef0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79  f not NULL, only
7f00: 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e   analyze this on
7f10: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
7f20: 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a   iStatCur,    /*
7f30: 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75   Index of VdbeCu
7f40: 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65 73  rsor that writes
7f50: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
7f60: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  1 table */.  int
7f70: 20 69 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a   iMem,        /*
7f80: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
7f90: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69  y locations begi
7fa0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
7fb0: 69 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20  iTab         /* 
7fc0: 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63  Next available c
7fd0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ursor */.){.  sq
7fe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7ff0: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61  se->db;    /* Da
8000: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
8010: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
8040: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
8050: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
8080: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  n index being an
8090: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
80a0: 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
80b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
80c0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64  e cursor */.  Vd
80d0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
80e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
80f0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8100: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
8110: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8140: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72  er */.  int jZer
8150: 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20  oRows = -1;     
8160: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
8170: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
8180: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
8190: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
81c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
81d0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20  ng pTab */.  u8 
81e0: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31  needTableCnt = 1
81f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
8200: 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74  e to count the t
8210: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
8220: 67 4e 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d  gNewRowid = iMem
8230: 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ++;    /* Rowid 
8240: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 65 64  for the inserted
8250: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
8260: 20 72 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d   regStat4 = iMem
8270: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ++;       /* Reg
8280: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74  ister to hold St
8290: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
82a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67  */.  int regChng
82b0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
82c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
82d0: 61 6e 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c  anged index fiel
82e0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
82f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8300: 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 72  OR_STAT4.  int r
8310: 65 67 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b  egRowid = iMem++
8320: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
8330: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
8340: 20 74 6f 20 73 74 61 74 5f 70 75 73 68 28 29 20   to stat_push() 
8350: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
8360: 72 65 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b  regTemp = iMem++
8370: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ;        /* Temp
8380: 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
8390: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54  er */.  int regT
83a0: 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b  abname = iMem++;
83b0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
83c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
83d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
83e0: 72 65 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65  regIdxname = iMe
83f0: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
8400: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
8410: 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  index name */.  
8420: 69 6e 74 20 72 65 67 53 74 61 74 31 20 3d 20 69  int regStat1 = i
8430: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8440: 56 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 74  Value for the st
8450: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c  at column of sql
8460: 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 69  ite_stat1 */.  i
8470: 6e 74 20 72 65 67 50 72 65 76 20 3d 20 69 4d 65  nt regPrev = iMe
8480: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  m;          /* M
8490: 55 53 54 20 42 45 20 4c 41 53 54 20 28 73 65 65  UST BE LAST (see
84a0: 20 62 65 6c 6f 77 29 20 2a 2f 0a 0a 20 20 70 50   below) */..  pP
84b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
84c0: 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 69  (pParse->nMem, i
84d0: 4d 65 6d 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  Mem);.  v = sqli
84e0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
84f0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  e);.  if( v==0 |
8500: 7c 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  | NEVER(pTab==0)
8510: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
8520: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
8530: 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  tnum==0 ){.    /
8540: 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20  * Do not gather 
8550: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69  statistics on vi
8560: 65 77 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ews or virtual t
8570: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  ables */.    ret
8580: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  urn;.  }.  if( s
8590: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
85a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
85b0: 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
85c0: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67  .    /* Do not g
85d0: 61 74 68 65 72 20 73 74 61 74 69 73 74 69 63 73  ather statistics
85e0: 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65   on system table
85f0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  s */.    return;
8600: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
8610: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
8620: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
8630: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
8640: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
8650: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
8660: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
8670: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
8680: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
8690: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
86a0: 20 30 29 20 29 3b 0a 23 69 66 6e 64 65 66 20 53   0) );.#ifndef S
86b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
86c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
86d0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
86e0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41  pParse, SQLITE_A
86f0: 4e 41 4c 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e  NALYZE, pTab->zN
8700: 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
8710: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
8720: 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
8730: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8740: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72  /* Establish a r
8750: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
8760: 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61  table at the sha
8770: 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e  red-cache level.
8780: 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65   .  ** Open a re
8790: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  ad-only cursor o
87a0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73  n the table. Als
87b0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  o allocate a cur
87c0: 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  sor number.  ** 
87d0: 74 6f 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e  to use for scann
87e0: 69 6e 67 20 69 6e 64 65 78 65 73 20 28 69 49 64  ing indexes (iId
87f0: 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20  xCur). No index 
8800: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
8810: 20 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69   at.  ** this ti
8820: 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20  me though.  */. 
8830: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
8840: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
8850: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
8860: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54  ab->zName);.  iT
8870: 61 62 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a  abCur = iTab++;.
8880: 20 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62    iIdxCur = iTab
8890: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ++;.  pParse->nT
88a0: 61 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  ab = MAX(pParse-
88b0: 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20  >nTab, iTab);.  
88c0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
88d0: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
88e0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
88f0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c  OpenRead);.  sql
8900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8910: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
8920: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 30 2c 20   regTabname, 0, 
8930: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
8940: 0a 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ..  for(pIdx=pTa
8950: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
8960: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8970: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c  t){.    int nCol
8980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
89a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 64 65 78  of columns index
89b0: 65 64 20 62 79 20 70 49 64 78 20 2a 2f 0a 20 20  ed by pIdx */.  
89c0: 20 20 69 6e 74 20 2a 61 47 6f 74 6f 43 68 6e 67    int *aGotoChng
89d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
89e0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a 75 6d 70  /* Array of jump
89f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
8a00: 72 65 73 73 65 73 20 2a 2f 0a 20 20 20 20 69 6e  resses */.    in
8a10: 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20  t addrRewind;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8a30: 64 64 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65  ddress of "OP_Re
8a40: 77 69 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f  wind iIdxCur" */
8a50: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74  .    int addrGot
8a60: 6f 43 68 6e 67 30 3b 20 20 20 20 20 20 20 20 20  oChng0;         
8a70: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
8a80: 20 22 47 6f 74 6f 20 61 64 64 72 5f 63 68 6e 67   "Goto addr_chng
8a90: 5f 30 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  _0" */.    int a
8aa0: 64 64 72 4e 65 78 74 52 6f 77 3b 20 20 20 20 20  ddrNextRow;     
8ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8ac0: 65 73 73 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77  ess of "next_row
8ad0: 3a 22 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  :" */.    const 
8ae0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 3b 20  char *zIdxName; 
8af0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8b00: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
8b10: 0a 20 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64  .    if( pOnlyId
8b20: 78 20 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70  x && pOnlyIdx!=p
8b30: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
8b40: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50      if( pIdx->pP
8b50: 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29  artIdxWhere==0 )
8b60: 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20   needTableCnt = 
8b70: 30 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  0;.    VdbeNoopC
8b80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
8b90: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 25 73  n analysis of %s
8ba0: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
8bb0: 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64  ;.    nCol = pId
8bc0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
8bd0: 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71 6c 69  aGotoChng = sqli
8be0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8bf0: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
8c00: 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 69 66  nCol+1));.    if
8c10: 28 20 61 47 6f 74 6f 43 68 6e 67 3d 3d 30 20 29  ( aGotoChng==0 )
8c20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
8c30: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
8c40: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
8c50: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ing the index na
8c60: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  me. */.    if( I
8c70: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
8c80: 28 70 49 64 78 29 20 26 26 20 21 48 61 73 52 6f  (pIdx) && !HasRo
8c90: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
8ca0: 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54     zIdxName = pT
8cb0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ab->zName;.    }
8cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 49 64 78  else{.      zIdx
8cd0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 7a 4e 61  Name = pIdx->zNa
8ce0: 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  me;.    }.    sq
8cf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8d00: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
8d10: 2c 20 72 65 67 49 64 78 6e 61 6d 65 2c 20 30 2c  , regIdxname, 0,
8d20: 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 0a   zIdxName, 0);..
8d30: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 73      /*.    ** Ps
8d40: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 6c 6f  eudo-code for lo
8d50: 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20 73 74  op that calls st
8d60: 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20 20 2a  at_push():.    *
8d70: 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e  *.    **   Rewin
8d80: 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69  d csr.    **   i
8d90: 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20  f eof(csr) goto 
8da0: 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20  end_of_scan;.   
8db0: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
8dc0: 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20  0.    **   goto 
8dd0: 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20 20 20  chng_addr_0;.   
8de0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74   **.    **  next
8df0: 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72  _row:.    **   r
8e00: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a  egChng = 0.    *
8e10: 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20 21  *   if( idx(0) !
8e20: 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20 67  = regPrev(0) ) g
8e30: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a  oto chng_addr_0.
8e40: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
8e50: 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 1.    **   if
8e60: 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67 50  ( idx(1) != regP
8e70: 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68  rev(1) ) goto ch
8e80: 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a  ng_addr_1.    **
8e90: 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20     ....    **   
8ea0: 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20  regChng = N.    
8eb0: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
8ec0: 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  ddr_N.    **.   
8ed0: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 30   **  chng_addr_0
8ee0: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72  :.    **   regPr
8ef0: 65 76 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20  ev(0) = idx(0). 
8f00: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
8f10: 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _1:.    **   reg
8f20: 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31 29  Prev(1) = idx(1)
8f30: 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20  .    **  ....   
8f40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67   **.    **  chng
8f50: 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20  _addr_N:.    ** 
8f60: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78    regRowid = idx
8f70: 28 72 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20  (rowid).    **  
8f80: 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65   stat_push(P, re
8f90: 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29  gChng, regRowid)
8fa0: 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63  .    **   Next c
8fb0: 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21  sr.    **   if !
8fc0: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65  eof(csr) goto ne
8fd0: 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a 0a 20  xt_row;.    **. 
8fe0: 20 20 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f 73 63     **  end_of_sc
8ff0: 61 6e 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20  an:.    */..    
9000: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9010: 72 65 20 61 72 65 20 65 6e 6f 75 67 68 20 6d 65  re are enough me
9020: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6c 6c 6f 63  mory cells alloc
9030: 61 74 65 64 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ated to accommod
9040: 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
9050: 72 65 67 50 72 65 76 20 61 72 72 61 79 20 61 6e  regPrev array an
9060: 64 20 61 20 74 72 61 69 6c 69 6e 67 20 72 6f 77  d a trailing row
9070: 69 64 20 28 74 68 65 20 72 6f 77 69 64 20 73 6c  id (the rowid sl
9080: 6f 74 20 69 73 20 72 65 71 75 69 72 65 64 0a 20  ot is required. 
9090: 20 20 20 2a 2a 20 77 68 65 6e 20 62 75 69 6c 64     ** when build
90a0: 69 6e 67 20 61 20 72 65 63 6f 72 64 20 74 6f 20  ing a record to 
90b0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
90c0: 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  sample column of
90d0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c   .    ** the sql
90e0: 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e  ite_stat4 table.
90f0: 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
9100: 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72  >nMem = MAX(pPar
9110: 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50 72 65  se->nMem, regPre
9120: 76 2b 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v+nCol);..    /*
9130: 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
9140: 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  y cursor on the 
9150: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
9160: 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73  yzed. */.    ass
9170: 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74 65  ert( iDb==sqlite
9180: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
9190: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
91a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
91b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
91c0: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
91d0: 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ur, pIdx->tnum, 
91e0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
91f0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
9200: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
9210: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
9220: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
9230: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
9240: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 74 61  * Invoke the sta
9250: 74 5f 69 6e 69 74 28 29 20 66 75 6e 63 74 69 6f  t_init() functio
9260: 6e 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  n. The arguments
9270: 20 61 72 65 3a 0a 20 20 20 20 2a 2a 20 0a 20 20   are:.    ** .  
9280: 20 20 2a 2a 20 20 20 20 28 31 29 20 74 68 65 20    **    (1) the 
9290: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
92a0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 69  s in the index i
92b0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f 77  ncluding the row
92c0: 69 64 2c 0a 20 20 20 20 2a 2a 20 20 20 20 28 32  id,.    **    (2
92d0: 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  ) the number of 
92e0: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
92f0: 78 2c 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x,.    **.    **
9300: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
9310: 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  ment is only use
9320: 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20  d for STAT3 and 
9330: 53 54 41 54 34 0a 20 20 20 20 2a 2f 0a 23 69 66  STAT4.    */.#if
9340: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9350: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9370: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
9380: 6e 74 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  nt, iIdxCur, reg
9390: 53 74 61 74 34 2b 32 29 3b 0a 23 65 6e 64 69 66  Stat4+2);.#endif
93a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
93b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
93c0: 65 67 65 72 2c 20 6e 43 6f 6c 2b 31 2c 20 72 65  eger, nCol+1, re
93d0: 67 53 74 61 74 34 2b 31 29 3b 0a 20 20 20 20 73  gStat4+1);.    s
93e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
93f0: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
9400: 20 30 2c 20 72 65 67 53 74 61 74 34 2b 31 2c 20   0, regStat4+1, 
9410: 72 65 67 53 74 61 74 34 29 3b 0a 20 20 20 20 73  regStat4);.    s
9420: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9430: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
9440: 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63 64 65  )&statInitFuncde
9450: 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
9460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9470: 68 61 6e 67 65 50 35 28 76 2c 20 31 2b 49 73 53  hangeP5(v, 1+IsS
9480: 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f 2a 20  tat34);..    /* 
9490: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
94a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
94b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
94c0: 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20   Rewind csr.    
94d0: 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72 29  **   if eof(csr)
94e0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61   goto end_of_sca
94f0: 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43  n;.    **   regC
9500: 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20  hng = 0.    **  
9510: 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68 5f   goto next_push_
9520: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  0;.    **.    */
9530: 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e 64 20  .    addrRewind 
9540: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
9550: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
9560: 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
9570: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
9580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9590: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
95a0: 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68 6e 67  eger, 0, regChng
95b0: 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 74 6f 43  );.    addrGotoC
95c0: 68 6e 67 30 20 3d 20 73 71 6c 69 74 65 33 56 64  hng0 = sqlite3Vd
95d0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
95e0: 6f 74 6f 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  oto);..    /*.  
95f0: 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a    **  next_row:.
9600: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9610: 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 0.    **   if
9620: 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67 50  ( idx(0) != regP
9630: 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63 68  rev(0) ) goto ch
9640: 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 2a 2a  ng_addr_0.    **
9650: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31 0a 20     regChng = 1. 
9660: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
9670: 31 29 20 21 3d 20 72 65 67 50 72 65 76 28 31 29  1) != regPrev(1)
9680: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
9690: 72 5f 31 0a 20 20 20 20 2a 2a 20 20 20 2e 2e 2e  r_1.    **   ...
96a0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
96b0: 67 20 3d 20 4e 0a 20 20 20 20 2a 2a 20 20 20 67  g = N.    **   g
96c0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 4e 0a  oto chng_addr_N.
96d0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 4e      */.    addrN
96e0: 65 78 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  extRow = sqlite3
96f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9700: 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
9710: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
9720: 20 20 20 20 20 63 68 61 72 20 2a 70 43 6f 6c 6c       char *pColl
9730: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
9740: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
9750: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43  Parse, pIdx->azC
9760: 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  oll[i]);.      s
9770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9780: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9790: 69 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20  i, regChng);.   
97a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
97b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
97c0: 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72  n, iIdxCur, i, r
97d0: 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61  egTemp);.      a
97e0: 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d 20 0a 20  GotoChng[i] = . 
97f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9800: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
9810: 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 72 65 67   regTemp, 0, reg
9820: 50 72 65 76 2b 69 2c 20 70 43 6f 6c 6c 2c 20 50  Prev+i, pColl, P
9830: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
9840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9850: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
9860: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
9870: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9880: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9890: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
98a0: 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 2c  P_Integer, nCol,
98b0: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 61   regChng);.    a
98c0: 47 6f 74 6f 43 68 6e 67 5b 6e 43 6f 6c 5d 20 3d  GotoChng[nCol] =
98d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98e0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
98f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
9900: 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20  chng_addr_0:.   
9910: 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30 29   **   regPrev(0)
9920: 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20 2a 2a   = idx(0).    **
9930: 20 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20    chng_addr_1:. 
9940: 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28     **   regPrev(
9950: 31 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20  1) = idx(1).    
9960: 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20  **  ....    */. 
9970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
9980: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
9990: 74 6f 43 68 6e 67 30 29 3b 0a 20 20 20 20 66 6f  toChng0);.    fo
99a0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
99b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
99c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
99d0: 2c 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b  , aGotoChng[i]);
99e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
99f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
9a00: 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
9a10: 69 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  i, regPrev+i);. 
9a20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
9a30: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 4e   **  chng_addr_N
9a40: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f  :.    **   regRo
9a50: 77 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29  wid = idx(rowid)
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53              // S
9a70: 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a  TAT34 only.    *
9a80: 2a 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c  *   stat_push(P,
9a90: 20 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77   regChng, regRow
9aa0: 69 64 29 20 20 2f 2f 20 33 72 64 20 70 61 72 61  id)  // 3rd para
9ab0: 6d 65 74 65 72 20 53 54 41 54 33 34 20 6f 6e 6c  meter STAT34 onl
9ac0: 79 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20  y.    **   Next 
9ad0: 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20  csr.    **   if 
9ae0: 21 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e  !eof(csr) goto n
9af0: 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a  ext_row;.    */.
9b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
9b10: 75 6d 70 48 65 72 65 28 76 2c 20 61 47 6f 74 6f  umpHere(v, aGoto
9b20: 43 68 6e 67 5b 6e 43 6f 6c 5d 29 3b 0a 23 69 66  Chng[nCol]);.#if
9b30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9b40: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67  .    assert( reg
9b60: 52 6f 77 69 64 3d 3d 28 72 65 67 53 74 61 74 34  Rowid==(regStat4
9b70: 2b 32 29 20 29 3b 0a 20 20 20 20 69 66 28 20 48  +2) );.    if( H
9b80: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
9b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9ba0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9bb0: 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
9bc0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
9bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
9be0: 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
9bf0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
9c00: 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
9c10: 0a 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6b 2c  .      int j, k,
9c20: 20 72 65 67 4b 65 79 3b 0a 20 20 20 20 20 20 72   regKey;.      r
9c30: 65 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47  egKey = sqlite3G
9c40: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
9c50: 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
9c60: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
9c70: 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
9c80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9c90: 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
9ca0: 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
9cb0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
9cc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9cd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9ce0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
9cf0: 72 2c 20 6b 2c 20 72 65 67 4b 65 79 2b 6a 29 3b  r, k, regKey+j);
9d00: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
9d10: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
9d20: 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61  Tab->aCol[pPk->a
9d30: 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
9d40: 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
9d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d60: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
9d70: 65 63 6f 72 64 2c 20 72 65 67 4b 65 79 2c 20 70  ecord, regKey, p
9d80: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67  Pk->nKeyCol, reg
9d90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
9da0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9db0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
9dc0: 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  gKey, pPk->nKeyC
9dd0: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ol);.    }.#endi
9de0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  f.    assert( re
9df0: 67 43 68 6e 67 3d 3d 28 72 65 67 53 74 61 74 34  gChng==(regStat4
9e00: 2b 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  +1) );.    sqlit
9e10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9e20: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c 20  OP_Function, 1, 
9e30: 72 65 67 53 74 61 74 34 2c 20 72 65 67 54 65 6d  regStat4, regTem
9e40: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
9e50: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
9e60: 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 50  1, (char*)&statP
9e70: 75 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f 46  ushFuncdef, P4_F
9e80: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
9e90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9ea0: 28 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29 3b  (v, 2+IsStat34);
9eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ec0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
9ed0: 74 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  t, iIdxCur, addr
9ee0: 4e 65 78 74 52 6f 77 29 3b 20 56 64 62 65 43 6f  NextRow); VdbeCo
9ef0: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
9f00: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
9f10: 20 74 6f 20 74 68 65 20 73 74 61 74 31 20 74 61   to the stat1 ta
9f20: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c 6c  ble. */.    call
9f30: 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74  StatGet(v, regSt
9f40: 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 53 54  at4, STAT_GET_ST
9f50: 41 54 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a  AT1, regStat1);.
9f60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9f70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
9f80: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
9f90: 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20  me, 3, regTemp, 
9fa0: 22 61 61 61 22 2c 20 30 29 3b 0a 20 20 20 20 73  "aaa", 0);.    s
9fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9fc0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
9fd0: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65   iStatCur, regNe
9fe0: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
9ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a000: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
a010: 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20  atCur, regTemp, 
a020: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
a030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a040: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
a050: 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20 2f 2a  APPEND);..    /*
a060: 20 41 64 64 20 74 68 65 20 65 6e 74 72 69 65 73   Add the entries
a070: 20 74 6f 20 74 68 65 20 73 74 61 74 33 20 6f 72   to the stat3 or
a080: 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f   stat4 table. */
a090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a0a0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
a0b0: 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20 20 20  TAT4.    {.     
a0c0: 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72 65 67   int regEq = reg
a0d0: 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69 6e 74  Stat1;.      int
a0e0: 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74 61 74   regLt = regStat
a0f0: 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+1;.      int r
a100: 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61 74 31  egDLt = regStat1
a110: 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  +2;.      int re
a120: 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53 74 61  gSample = regSta
a130: 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+3;.      int 
a140: 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74 61 74  regCol = regStat
a150: 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+4;.      int r
a160: 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 3d 20  egSampleRowid = 
a170: 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b 0a 20  regCol + nCol;. 
a180: 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78       int addrNex
a190: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
a1a0: 72 49 73 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 75  rIsNull;.      u
a1b0: 38 20 73 65 65 6b 4f 70 20 3d 20 48 61 73 52 6f  8 seekOp = HasRo
a1c0: 77 69 64 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e  wid(pTab) ? OP_N
a1d0: 6f 74 45 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f  otExists : OP_No
a1e0: 74 46 6f 75 6e 64 3b 0a 0a 20 20 20 20 20 20 70  tFound;..      p
a1f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
a200: 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  X(pParse->nMem, 
a210: 72 65 67 43 6f 6c 2b 6e 43 6f 6c 2b 31 29 3b 0a  regCol+nCol+1);.
a220: 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
a230: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
a240: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
a250: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
a260: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
a270: 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65 67 53  _GET_ROWID, regS
a280: 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20  ampleRowid);.   
a290: 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20     addrIsNull = 
a2a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2b0: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
a2c0: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b  regSampleRowid);
a2d0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
a2e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 63 61  age(v);.      ca
a2f0: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
a300: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
a310: 4e 45 51 2c 20 72 65 67 45 71 29 3b 0a 20 20 20  NEQ, regEq);.   
a320: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
a330: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
a340: 5f 47 45 54 5f 4e 4c 54 2c 20 72 65 67 4c 74 29  _GET_NLT, regLt)
a350: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
a360: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
a370: 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 2c 20   STAT_GET_NDLT, 
a380: 72 65 67 44 4c 74 29 3b 0a 20 20 20 20 20 20 73  regDLt);.      s
a390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a3a0: 49 6e 74 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69  Int(v, seekOp, i
a3b0: 54 61 62 43 75 72 2c 20 61 64 64 72 4e 65 78 74  TabCur, addrNext
a3c0: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
a3d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 57  , 0);.      /* W
a3e0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
a3f0: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 72  regSampleRowid r
a400: 6f 77 20 65 78 69 73 74 73 20 62 65 63 61 75 73  ow exists becaus
a410: 65 20 69 74 20 77 61 73 20 72 65 61 64 20 62 79  e it was read by
a420: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
a430: 65 76 69 6f 75 73 20 6c 6f 6f 70 2e 20 20 54 68  evious loop.  Th
a440: 75 73 20 74 68 65 20 6e 6f 74 2d 66 6f 75 6e 64  us the not-found
a450: 20 6a 75 6d 70 20 6f 66 20 73 65 65 6b 4f 70 20   jump of seekOp 
a460: 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 20  will never.     
a470: 20 2a 2a 20 62 65 20 74 61 6b 65 6e 20 2a 2f 0a   ** be taken */.
a480: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a490: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
a4a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a4b0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
a4c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a4d0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
a4e0: 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 43  e(v, pTab, iTabC
a4f0: 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
a520: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65  >aiColumn[0], re
a530: 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a  gSample);.#else.
a540: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a550: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
a560: 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20       i16 iCol = 
a570: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
a580: 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
a590: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
a5a0: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
a5b0: 61 62 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f  ab, iTabCur, iCo
a5c0: 6c 2c 20 72 65 67 43 6f 6c 2b 69 29 3b 0a 20 20  l, regCol+i);.  
a5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a5f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a600: 72 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2b 31 2c 20  regCol, nCol+1, 
a610: 72 65 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6e 64  regSample);.#end
a620: 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
a630: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a640: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
a650: 54 61 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67 54  Tabname, 6, regT
a660: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
a670: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a680: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53   OP_NewRowid, iS
a690: 74 61 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77  tatCur+1, regNew
a6a0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
a6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a6c0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53  v, OP_Insert, iS
a6d0: 74 61 74 43 75 72 2b 31 2c 20 72 65 67 54 65 6d  tatCur+1, regTem
a6e0: 70 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b  p, regNewRowid);
a6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
a710: 6f 74 6f 2c 20 31 2c 20 61 64 64 72 4e 65 78 74  oto, 1, addrNext
a720: 29 3b 20 2f 2a 20 50 31 3d 3d 31 20 66 6f 72 20  ); /* P1==1 for 
a730: 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 2a 2f 0a 20  end-of-loop */. 
a740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a750: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a760: 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23  IsNull);.    }.#
a770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a780: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
a790: 53 54 41 54 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a  STAT4 */..    /*
a7a0: 20 45 6e 64 20 6f 66 20 61 6e 61 6c 79 73 69 73   End of analysis
a7b0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
a7c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
a7d0: 64 64 72 52 65 77 69 6e 64 29 3b 0a 20 20 20 20  ddrRewind);.    
a7e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a7f0: 2c 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a 20 20  , aGotoChng);.  
a800: 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  }...  /* Create 
a810: 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65 5f  a single sqlite_
a820: 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f 6e 74  stat1 entry cont
a830: 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74  aining NULL as t
a840: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6e 61  he index.  ** na
a850: 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77 20 63  me and the row c
a860: 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f 6e 74  ount as the cont
a870: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ent..  */.  if( 
a880: 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26 20 6e  pOnlyIdx==0 && n
a890: 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b 0a 20  eedTableCnt ){. 
a8a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
a8b0: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
a8c0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Name));.    sqli
a8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a8e0: 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61 62 43   OP_Count, iTabC
a8f0: 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20  ur, regStat1);. 
a900: 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73     jZeroRows = s
a910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a920: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
a930: 67 53 74 61 74 31 29 3b 20 56 64 62 65 43 6f 76  gStat1); VdbeCov
a940: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
a950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a960: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
a970: 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20 20 20  egIdxname);.    
a980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a990: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a9a0: 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20  rd, regTabname, 
a9b0: 33 2c 20 72 65 67 54 65 6d 70 2c 20 22 61 61 61  3, regTemp, "aaa
a9c0: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
a9d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a9e0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74  OP_NewRowid, iSt
a9f0: 61 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77  atCur, regNewRow
aa00: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
aa10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aa20: 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75  _Insert, iStatCu
aa30: 72 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e  r, regTemp, regN
aa40: 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  ewRowid);.    sq
aa50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
aa60: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
aa70: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
aa80: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
aa90: 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a  jZeroRows);.  }.
aaa0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
aab0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
aac0: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74  l cause the most
aad0: 20 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e   recent index an
aae0: 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20  alysis to.** be 
aaf0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65  loaded into inte
ab00: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
ab10: 20 77 68 65 72 65 20 69 73 20 63 61 6e 20 62 65   where is can be
ab20: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
ab30: 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73   void loadAnalys
ab40: 69 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  is(Parse *pParse
ab50: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
ab60: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ab70: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ab80: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
ab90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
aba0: 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79  (v, OP_LoadAnaly
abb0: 73 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d  sis, iDb);.  }.}
abc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
abd0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
abe0: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
abf0: 66 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61  f an entire data
ac00: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  base.*/.static v
ac10: 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62  oid analyzeDatab
ac20: 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
ac30: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
ac40: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ac50: 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d  rse->db;.  Schem
ac60: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
ac70: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
ac80: 61 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20  a;    /* Schema 
ac90: 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  of database iDb 
aca0: 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
acb0: 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72  ;.  int iStatCur
acc0: 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20  ;.  int iMem;.  
acd0: 69 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c  int iTab;..  sql
ace0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
acf0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
ad00: 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74  0, iDb);.  iStat
ad10: 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
ad20: 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  ab;.  pParse->nT
ad30: 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53  ab += 3;.  openS
ad40: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
ad50: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
ad60: 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  0, 0);.  iMem = 
ad70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
ad80: 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
ad90: 3e 6e 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >nTab;.  assert(
ada0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
adb0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
adc0: 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73   0) );.  for(k=s
add0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
ade0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
adf0: 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
ae00: 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
ae10: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
ae20: 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
ae30: 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61  Data(k);.    ana
ae40: 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61  lyzeOneTable(pPa
ae50: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 53  rse, pTab, 0, iS
ae60: 74 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54  tatCur, iMem, iT
ae70: 61 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41  ab);.  }.  loadA
ae80: 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20  nalysis(pParse, 
ae90: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iDb);.}../*.** G
aea0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
aeb0: 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61  t will do an ana
aec0: 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c  lysis of a singl
aed0: 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20  e table in.** a 
aee0: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 70 4f  database.  If pO
aef0: 6e 6c 79 49 64 78 20 69 73 20 6e 6f 74 20 4e 55  nlyIdx is not NU
af00: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  LL then it is a 
af10: 73 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20  single index.** 
af20: 69 6e 20 70 54 61 62 20 74 68 61 74 20 73 68 6f  in pTab that sho
af30: 75 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e  uld be analyzed.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af50: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72  analyzeTable(Par
af60: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
af70: 65 20 2a 70 54 61 62 2c 20 49 6e 64 65 78 20 2a  e *pTab, Index *
af80: 70 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74  pOnlyIdx){.  int
af90: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61   iDb;.  int iSta
afa0: 74 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  tCur;..  assert(
afb0: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
afc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
afd0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
afe0: 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b  s(pParse->db) );
aff0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
b000: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
b010: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
b020: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
b030: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
b040: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
b050: 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43  , iDb);.  iStatC
b060: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
b070: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
b080: 62 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f  b += 3;.  if( pO
b090: 6e 6c 79 49 64 78 20 29 7b 0a 20 20 20 20 6f 70  nlyIdx ){.    op
b0a0: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
b0b0: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
b0c0: 72 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61  r, pOnlyIdx->zNa
b0d0: 6d 65 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d 65  me, "idx");.  }e
b0e0: 6c 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61  lse{.    openSta
b0f0: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  tTable(pParse, i
b100: 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54  Db, iStatCur, pT
b110: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22  ab->zName, "tbl"
b120: 29 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65  );.  }.  analyze
b130: 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  OneTable(pParse,
b140: 20 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c   pTab, pOnlyIdx,
b150: 20 69 53 74 61 74 43 75 72 2c 70 50 61 72 73 65   iStatCur,pParse
b160: 2d 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d  ->nMem+1,pParse-
b170: 3e 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e  >nTab);.  loadAn
b180: 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69  alysis(pParse, i
b190: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Db);.}../*.** Ge
b1a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
b1b0: 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
b1c0: 61 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72  and.  The parser
b1d0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
b1e0: 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72  ine.** when it r
b1f0: 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41  ecognizes an ANA
b200: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
b210: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
b220: 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE              
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
b240: 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41   1.**        ANA
b250: 4c 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e  LYZE  <database>
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41  -- 2.**        A
b280: 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61  NALYZE  ?<databa
b290: 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
b2a0: 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 3.**.** For
b2b0: 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
b2c0: 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
b2d0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b2e0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
b2f0: 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79  .** Form 2 analy
b300: 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  zes all indices 
b310: 74 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62  the single datab
b320: 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f  ase named..** Fo
b330: 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c  rm 3 analyzes al
b340: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
b350: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
b360: 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  med table..*/.vo
b370: 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a  id sqlite3Analyz
b380: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b390: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
b3a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
b3b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b3c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b3d0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  t iDb;.  int i;.
b3e0: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b    char *z, *zDb;
b3f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b400: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b410: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
b420: 6d 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  me;..  /* Read t
b430: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
b440: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
b450: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
b460: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
b470: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
b480: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
b490: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  n NULL. */.  ass
b4a0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
b4b0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
b4c0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
b4d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
b4e0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
b4f0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
b500: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
b510: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21   assert( pName2!
b520: 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20  =0 || pName1==0 
b530: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  );.  if( pName1=
b540: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  =0 ){.    /* For
b550: 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76  m 1:  Analyze ev
b560: 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
b570: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
b580: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
b590: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
b5a0: 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  nue;  /* Do not 
b5b0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50  analyze the TEMP
b5c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
b5d0: 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61     analyzeDataba
b5e0: 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  se(pParse, i);. 
b5f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
b600: 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b   pName2->n==0 ){
b610: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20  .    /* Form 2: 
b620: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74   Analyze the dat
b630: 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e  abase or table n
b640: 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20  amed */.    iDb 
b650: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
b660: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
b670: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
b680: 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61       analyzeData
b690: 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62  base(pParse, iDb
b6a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b6b0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
b6c0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
b6d0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
b6e0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
b6f0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
b700: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
b710: 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  , z, 0))!=0 ){. 
b720: 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65           analyze
b730: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49  Table(pParse, pI
b740: 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78  dx->pTable, pIdx
b750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b760: 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c   if( (pTab = sql
b770: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
b780: 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 30 29  pParse, 0, z, 0)
b790: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
b7a0: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
b7b0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
b7c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b7d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b7e0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  (db, z);.      }
b7f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
b800: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41      /* Form 3: A
b810: 6e 61 6c 79 7a 65 20 74 68 65 20 66 75 6c 6c 79  nalyze the fully
b820: 20 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65   qualified table
b830: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 44 62   name */.    iDb
b840: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
b850: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
b860: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
b870: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20  TableName);.    
b880: 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
b890: 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44      zDb = db->aD
b8a0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
b8b0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
b8c0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
b8d0: 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20   pTableName);.  
b8e0: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
b8f0: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20 3d       if( (pIdx =
b900: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
b910: 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d  x(db, z, zDb))!=
b920: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
b930: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72  nalyzeTable(pPar
b940: 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  se, pIdx->pTable
b950: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
b960: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62   }else if( (pTab
b970: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
b980: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
b990: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
b9a0: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
b9b0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
b9c0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
b9d0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
b9e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
b9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20  .      }.    }  
ba00: 20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   .  }.}../*.** U
ba10: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
ba20: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
ba30: 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72   analyzer reader
ba40: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a   through to the.
ba50: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ** callback rout
ba60: 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ine..*/.typedef 
ba70: 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49  struct analysisI
ba80: 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  nfo analysisInfo
ba90: 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69  ;.struct analysi
baa0: 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  sInfo {.  sqlite
bab0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
bac0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a  har *zDatabase;.
bad0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  };../*.** The fi
bae0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 6f 69  rst argument poi
baf0: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
bb00: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
bb10: 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c  ontaining a.** l
bb20: 69 73 74 20 6f 66 20 73 70 61 63 65 20 73 65 70  ist of space sep
bb30: 61 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e  arated integers.
bb40: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
bb50: 6e 4f 75 74 20 6f 66 20 74 68 65 73 65 20 69 6e  nOut of these in
bb60: 74 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  to.** the array 
bb70: 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69  aOut[]..*/.stati
bb80: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 49 6e 74  c void decodeInt
bb90: 41 72 72 61 79 28 0a 20 20 63 68 61 72 20 2a 7a  Array(.  char *z
bba0: 49 6e 74 41 72 72 61 79 2c 20 20 20 20 20 20 20  IntArray,       
bbb0: 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69  /* String contai
bbc0: 6e 69 6e 67 20 69 6e 74 20 61 72 72 61 79 20 74  ning int array t
bbd0: 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  o decode */.  in
bbe0: 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
bbf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bc00: 66 20 73 6c 6f 74 73 20 69 6e 20 61 4f 75 74 5b  f slots in aOut[
bc10: 5d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  ] */.  tRowcnt *
bc20: 61 4f 75 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  aOut,         /*
bc30: 20 53 74 6f 72 65 20 69 6e 74 65 67 65 72 73 20   Store integers 
bc40: 68 65 72 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  here */.  LogEst
bc50: 20 2a 61 4c 6f 67 2c 20 20 20 20 20 20 20 20 20   *aLog,         
bc60: 20 2f 2a 20 4f 72 2c 20 69 66 20 61 4f 75 74 3d   /* Or, if aOut=
bc70: 3d 30 2c 20 68 65 72 65 20 2a 2f 0a 20 20 49 6e  =0, here */.  In
bc80: 64 65 78 20 2a 70 49 6e 64 65 78 20 20 20 20 20  dex *pIndex     
bc90: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 65       /* Handle e
bca0: 78 74 72 61 20 66 6c 61 67 73 20 66 6f 72 20 74  xtra flags for t
bcb0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
bcc0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63  t NULL */.){.  c
bcd0: 68 61 72 20 2a 7a 20 3d 20 7a 49 6e 74 41 72 72  har *z = zIntArr
bce0: 61 79 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  ay;.  int c;.  i
bcf0: 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20  nt i;.  tRowcnt 
bd00: 76 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v;..#ifdef SQLIT
bd10: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
bd20: 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 7a 3d  R_STAT4.  if( z=
bd30: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c  =0 ) z = "";.#el
bd40: 73 65 0a 20 20 69 66 28 20 4e 45 56 45 52 28 7a  se.  if( NEVER(z
bd50: 3d 3d 30 29 20 29 20 7a 20 3d 20 22 22 3b 0a 23  ==0) ) z = "";.#
bd60: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b  endif.  for(i=0;
bd70: 20 2a 7a 20 26 26 20 69 3c 6e 4f 75 74 3b 20 69   *z && i<nOut; i
bd80: 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a  ++){.    v = 0;.
bd90: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
bda0: 30 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  0])>='0' && c<='
bdb0: 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  9' ){.      v = 
bdc0: 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a  v*10 + c - '0';.
bdd0: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
bde0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
bdf0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
be00: 54 41 54 34 0a 20 20 20 20 69 66 28 20 61 4f 75  TAT4.    if( aOu
be10: 74 20 29 7b 0a 20 20 20 20 20 20 61 4f 75 74 5b  t ){.      aOut[
be20: 69 5d 20 3d 20 76 3b 0a 20 20 20 20 7d 65 6c 73  i] = v;.    }els
be30: 65 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65  e.#else.    asse
be40: 72 74 28 20 61 4f 75 74 3d 3d 30 20 29 3b 0a 20  rt( aOut==0 );. 
be50: 20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45     UNUSED_PARAME
be60: 54 45 52 28 61 4f 75 74 29 3b 0a 23 65 6e 64 69  TER(aOut);.#endi
be70: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 61 4c  f.    {.      aL
be80: 6f 67 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  og[i] = sqlite3L
be90: 6f 67 45 73 74 28 76 29 3b 0a 20 20 20 20 7d 0a  ogEst(v);.    }.
bea0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20      if( *z==' ' 
beb0: 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64  ) z++;.  }.#ifnd
bec0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bed0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
bee0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
bef0: 21 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 69  !=0 );.#else.  i
bf00: 66 28 20 70 49 6e 64 65 78 20 29 0a 23 65 6e 64  f( pIndex ).#end
bf10: 69 66 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 73  if.  {.    if( s
bf20: 74 72 63 6d 70 28 7a 2c 20 22 75 6e 6f 72 64 65  trcmp(z, "unorde
bf30: 72 65 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  red")==0 ){.    
bf40: 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64    pIndex->bUnord
bf50: 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  ered = 1;.    }e
bf60: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
bf70: 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30 2d 39  strglob("sz=[0-9
bf80: 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  ]*", z)==0 ){.  
bf90: 20 20 20 20 69 6e 74 20 76 33 32 20 3d 20 30 3b      int v32 = 0;
bfa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
bfb0: 74 49 6e 74 33 32 28 7a 2b 33 2c 20 26 76 33 32  tInt32(z+3, &v32
bfc0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  );.      pIndex-
bfd0: 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69  >szIdxRow = sqli
bfe0: 74 65 33 4c 6f 67 45 73 74 28 76 33 32 29 3b 0a  te3LogEst(v32);.
bff0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c000: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
c010: 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
c020: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
c030: 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65  when reading the
c040: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31  .** sqlite_stat1
c050: 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20   table.  .**.** 
c060: 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61      argv[0] = na
c070: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  me of the table.
c080: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
c090: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
c0a0: 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55 4c  ex (might be NUL
c0b0: 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32  L).**     argv[2
c0c0: 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61  ] = results of a
c0d0: 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74  nalysis - on int
c0e0: 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f  eger for each co
c0f0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69  lumn.**.** Entri
c100: 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72 67  es for which arg
c110: 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c  v[1]==NULL simpl
c120: 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  y record the num
c130: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a  ber of rows in.*
c140: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  * the table..*/.
c150: 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
c160: 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a  sisLoader(void *
c170: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
c180: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
c190: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
c1a0: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70   analysisInfo *p
c1b0: 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73  Info = (analysis
c1c0: 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49  Info*)pData;.  I
c1d0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
c1e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
c1f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
c200: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
c210: 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =3 );.  UNUSED_P
c220: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
c230: 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69 66 28  d, argc);..  if(
c240: 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76   argv==0 || argv
c250: 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 32  [0]==0 || argv[2
c260: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]==0 ){.    retu
c270: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
c280: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
c290: 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e 64 62 2c  Table(pInfo->db,
c2a0: 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d   argv[0], pInfo-
c2b0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  >zDatabase);.  i
c2c0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
c2d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c2e0: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 3d  }.  if( argv[1]=
c2f0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  =0 ){.    pIndex
c300: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
c310: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
c320: 70 28 61 72 67 76 5b 30 5d 2c 61 72 67 76 5b 31  p(argv[0],argv[1
c330: 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  ])==0 ){.    pIn
c340: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 50 72 69  dex = sqlite3Pri
c350: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
c360: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
c370: 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69     pIndex = sqli
c380: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e  te3FindIndex(pIn
c390: 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c  fo->db, argv[1],
c3a0: 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73   pInfo->zDatabas
c3b0: 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72  e);.  }.  z = ar
c3c0: 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49  gv[2];..  if( pI
c3d0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 64 65 63 6f  ndex ){.    deco
c3e0: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
c3f0: 2a 29 7a 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  *)z, pIndex->nKe
c400: 79 43 6f 6c 2b 31 2c 20 30 2c 20 70 49 6e 64 65  yCol+1, 0, pInde
c410: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 2c 20  x->aiRowLogEst, 
c420: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
c430: 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
c440: 78 57 68 65 72 65 3d 3d 30 20 29 20 70 54 61 62  xWhere==0 ) pTab
c450: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
c460: 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f   pIndex->aiRowLo
c470: 67 45 73 74 5b 30 5d 3b 0a 20 20 7d 65 6c 73 65  gEst[0];.  }else
c480: 7b 0a 20 20 20 20 49 6e 64 65 78 20 66 61 6b 65  {.    Index fake
c490: 49 64 78 3b 0a 20 20 20 20 66 61 6b 65 49 64 78  Idx;.    fakeIdx
c4a0: 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
c4b0: 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  le->szTabRow;.  
c4c0: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
c4d0: 28 28 63 68 61 72 2a 29 7a 2c 20 31 2c 20 30 2c  ((char*)z, 1, 0,
c4e0: 20 26 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f   &pTable->nRowLo
c4f0: 67 45 73 74 2c 20 26 66 61 6b 65 49 64 78 29 3b  gEst, &fakeIdx);
c500: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54  .    pTable->szT
c510: 61 62 52 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e  abRow = fakeIdx.
c520: 73 7a 49 64 78 52 6f 77 3b 0a 20 20 7d 0a 0a 20  szIdxRow;.  }.. 
c530: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c540: 0a 2a 2a 20 49 66 20 74 68 65 20 49 6e 64 65 78  .** If the Index
c550: 2e 61 53 61 6d 70 6c 65 20 76 61 72 69 61 62 6c  .aSample variabl
c560: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64  e is not NULL, d
c570: 65 6c 65 74 65 20 74 68 65 20 61 53 61 6d 70 6c  elete the aSampl
c580: 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64  e[] array.** and
c590: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a   its contents..*
c5a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
c5b0: 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
c5c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
c5d0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 23 69 66 64  dex *pIdx){.#ifd
c5e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c5f0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c600: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d    if( pIdx->aSam
c610: 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ple ){.    int j
c620: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
c630: 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
c640: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  j++){.      Inde
c650: 78 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49  xSample *p = &pI
c660: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a  dx->aSample[j];.
c670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c680: 72 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a 20  ree(db, p->p);. 
c690: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c6a0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d  DbFree(db, pIdx-
c6b0: 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20  >aSample);.  }. 
c6c0: 20 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e 70   if( db && db->p
c6d0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
c6e0: 7b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d  {.    pIdx->nSam
c6f0: 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  ple = 0;.    pId
c700: 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a  x->aSample = 0;.
c710: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
c720: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
c730: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
c740: 45 54 45 52 28 70 49 64 78 29 3b 0a 23 65 6e 64  ETER(pIdx);.#end
c750: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
c760: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
c770: 54 34 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66 20  T4 */.}..#ifdef 
c780: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c790: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
c7a0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
c7b0: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 5d 20 61  pIdx->aAvgEq[] a
c7c0: 72 72 61 79 20 62 61 73 65 64 20 6f 6e 20 74 68  rray based on th
c7d0: 65 20 73 61 6d 70 6c 65 73 20 63 75 72 72 65 6e  e samples curren
c7e0: 74 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  tly.** stored in
c7f0: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d   pIdx->aSample[]
c800: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
c810: 64 20 69 6e 69 74 41 76 67 45 71 28 49 6e 64 65  d initAvgEq(Inde
c820: 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
c830: 70 49 64 78 20 29 7b 0a 20 20 20 20 49 6e 64 65  pIdx ){.    Inde
c840: 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
c850: 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
c860: 3b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c  ;.    IndexSampl
c870: 65 20 2a 70 46 69 6e 61 6c 20 3d 20 26 61 53 61  e *pFinal = &aSa
c880: 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70  mple[pIdx->nSamp
c890: 6c 65 2d 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69  le-1];.    int i
c8a0: 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f  Col;.    for(iCo
c8b0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  l=0; iCol<pIdx->
c8c0: 6e 4b 65 79 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  nKeyCol; iCol++)
c8d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
c900: 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 61 6d  rate through sam
c910: 70 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52  ples */.      tR
c920: 6f 77 63 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b  owcnt sumEq = 0;
c930: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f          /* Sum o
c940: 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73  f the nEq values
c950: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
c960: 74 20 6e 53 75 6d 20 3d 20 30 3b 20 20 20 20 20  t nSum = 0;     
c970: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c980: 20 74 65 72 6d 73 20 63 6f 6e 74 72 69 62 75 74   terms contribut
c990: 69 6e 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f 0a  ing to sumEq */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 76        tRowcnt av
c9b0: 67 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 74  gEq = 0;.      t
c9c0: 52 6f 77 63 6e 74 20 6e 44 4c 74 20 3d 20 70 46  Rowcnt nDLt = pF
c9d0: 69 6e 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43 6f 6c  inal->anDLt[iCol
c9e0: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  ];..      /* Set
c9f0: 20 6e 53 75 6d 20 74 6f 20 74 68 65 20 6e 75 6d   nSum to the num
ca00: 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20  ber of distinct 
ca10: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
ca20: 72 65 66 69 78 65 73 20 74 68 61 74 0a 20 20 20  refixes that.   
ca30: 20 20 20 2a 2a 20 6f 63 63 75 72 20 69 6e 20 74     ** occur in t
ca40: 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 20 66  he stat4 table f
ca50: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 20 62 65  or this index be
ca60: 66 6f 72 65 20 70 46 69 6e 61 6c 2e 20 53 65 74  fore pFinal. Set
ca70: 0a 20 20 20 20 20 20 2a 2a 20 73 75 6d 45 71 20  .      ** sumEq 
ca80: 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
ca90: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 66 6f 72  e nEq values for
caa0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f 72   column iCol for
cab0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
cac0: 2a 2a 20 73 65 74 20 28 61 64 64 69 6e 67 20 74  ** set (adding t
cad0: 68 65 20 76 61 6c 75 65 20 6f 6e 6c 79 20 6f 6e  he value only on
cae0: 63 65 20 77 68 65 72 65 20 74 68 65 72 65 20 65  ce where there e
caf0: 78 69 73 74 20 64 75 70 69 63 61 74 65 20 0a 20  xist dupicate . 
cb00: 20 20 20 20 20 2a 2a 20 70 72 65 66 69 78 65 73       ** prefixes
cb10: 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ).  */.      for
cb20: 28 69 3d 30 3b 20 69 3c 28 70 49 64 78 2d 3e 6e  (i=0; i<(pIdx->n
cb30: 53 61 6d 70 6c 65 2d 31 29 3b 20 69 2b 2b 29 7b  Sample-1); i++){
cb40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
cb50: 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43  mple[i].anDLt[iC
cb60: 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b 31  ol]!=aSample[i+1
cb70: 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 29 7b  ].anDLt[iCol] ){
cb80: 0a 20 20 20 20 20 20 20 20 20 20 73 75 6d 45 71  .          sumEq
cb90: 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61   += aSample[i].a
cba0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nEq[iCol];.     
cbb0: 20 20 20 20 20 6e 53 75 6d 2b 2b 3b 0a 20 20 20       nSum++;.   
cbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cbd0: 20 20 20 20 20 69 66 28 20 6e 44 4c 74 3e 6e 53       if( nDLt>nS
cbe0: 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 76  um ){.        av
cbf0: 67 45 71 20 3d 20 28 70 46 69 6e 61 6c 2d 3e 61  gEq = (pFinal->a
cc00: 6e 4c 74 5b 69 43 6f 6c 5d 20 2d 20 73 75 6d 45  nLt[iCol] - sumE
cc10: 71 29 2f 28 6e 44 4c 74 20 2d 20 6e 53 75 6d 29  q)/(nDLt - nSum)
cc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cc30: 69 66 28 20 61 76 67 45 71 3d 3d 30 20 29 20 61  if( avgEq==0 ) a
cc40: 76 67 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  vgEq = 1;.      
cc50: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
cc60: 6c 5d 20 3d 20 61 76 67 45 71 3b 0a 20 20 20 20  l] = avgEq;.    
cc70: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d    if( pIdx->nSam
cc80: 70 6c 65 43 6f 6c 3d 3d 31 20 29 20 62 72 65 61  pleCol==1 ) brea
cc90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
cca0: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20 61 6e  /*.** Look up an
ccb0: 20 69 6e 64 65 78 20 62 79 20 6e 61 6d 65 2e 20   index by name. 
ccc0: 20 4f 72 2c 20 69 66 20 74 68 65 20 6e 61 6d 65   Or, if the name
ccd0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
cce0: 57 49 44 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  WID table.** is 
ccf0: 73 75 70 70 6c 69 65 64 20 69 6e 73 74 65 61 64  supplied instead
cd00: 2c 20 66 69 6e 64 20 74 68 65 20 50 52 49 4d 41  , find the PRIMA
cd10: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
cd20: 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a   that table..*/.
cd30: 73 74 61 74 69 63 20 49 6e 64 65 78 20 2a 66 69  static Index *fi
cd40: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
cd50: 4b 65 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Key(.  sqlite3 *
cd60: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
cd70: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74   *zName,.  const
cd80: 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20   char *zDb.){.  
cd90: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
cda0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
cdb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
cdc0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
cdd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
cde0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
cdf0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  ble(db, zName, z
ce00: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
ce10: 62 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70  b && !HasRowid(p
ce20: 54 61 62 29 20 29 20 70 49 64 78 20 3d 20 73 71  Tab) ) pIdx = sq
ce30: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
ce40: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a  ndex(pTab);.  }.
ce50: 20 20 72 65 74 75 72 6e 20 70 49 64 78 3b 0a 7d    return pIdx;.}
ce60: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
ce70: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69   content from ei
ce80: 74 68 65 72 20 74 68 65 20 73 71 6c 69 74 65 5f  ther the sqlite_
ce90: 73 74 61 74 34 20 6f 72 20 73 71 6c 69 74 65 5f  stat4 or sqlite_
cea0: 73 74 61 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20  stat3 table .** 
ceb0: 69 6e 74 6f 20 74 68 65 20 72 65 6c 65 76 61 6e  into the relevan
cec0: 74 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  t Index.aSample[
ced0: 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20  ] arrays..**.** 
cee0: 41 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20  Arguments zSql1 
cef0: 61 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74 20 70  and zSql2 must p
cf00: 6f 69 6e 74 20 74 6f 20 53 51 4c 20 73 74 61 74  oint to SQL stat
cf10: 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65 74 75  ements that retu
cf20: 72 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75 69 76  rn.** data equiv
cf30: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c  alent to the fol
cf40: 6c 6f 77 69 6e 67 20 28 73 74 61 74 65 6d 65 6e  lowing (statemen
cf50: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
cf60: 20 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73   for stat3,.** s
cf70: 65 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  ee the caller of
cf80: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
cf90: 6f 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a  or details):.**.
cfa0: 2a 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c  **    zSql1: SEL
cfb0: 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29  ECT idx,count(*)
cfc0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
cfd0: 73 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69  stat4 GROUP BY i
cfe0: 64 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20  dx.**    zSql2: 
cff0: 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e  SELECT idx,neq,n
d000: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46  lt,ndlt,sample F
d010: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
d020: 61 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  at4.**.** where 
d030: 25 51 20 69 73 20 72 65 70 6c 61 63 65 64 20 77  %Q is replaced w
d040: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
d050: 20 6e 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65   name before the
d060: 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64   SQL is executed
d070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d080: 6c 6f 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73  loadStatTbl(.  s
d090: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0b0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
d0c0: 2a 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 33 2c  */.  int bStat3,
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e     /* Assume sin
d0f0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72  gle column recor
d100: 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e  ds only */.  con
d110: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20  st char *zSql1, 
d120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
d130: 4c 20 73 74 61 74 65 6d 65 6e 74 20 31 20 28 73  L statement 1 (s
d140: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63  ee above) */.  c
d150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
d160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d170: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 32 20  SQL statement 2 
d180: 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20  (see above) */. 
d190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
d1c0: 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f  (e.g. "main") */
d1d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
d200: 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  des from subrout
d210: 69 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ines */.  sqlite
d220: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
d230: 30 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51  0;      /* An SQ
d240: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  L statement bein
d250: 67 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20  g run */.  char 
d260: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
d270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
d280: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
d290: 65 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ement */.  Index
d2a0: 20 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20   *pPrevIdx = 0; 
d2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
d2c0: 69 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68  ious index in th
d2d0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65  e loop */.  Inde
d2e0: 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65  xSample *pSample
d2f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  ;         /* A s
d300: 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61 53 61  lot in pIdx->aSa
d310: 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  mple[] */..  ass
d320: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
d330: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
d340: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
d350: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53  e3MPrintf(db, zS
d360: 71 6c 31 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  ql1, zDb);.  if(
d370: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65   !zSql ){.    re
d380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d390: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
d3a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
d3b0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
d3c0: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
d3d0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
d3e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
d3f0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
d400: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
d410: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
d420: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49  OW ){.    int nI
d430: 64 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20  dxCol = 1;      
d440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d450: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
d460: 73 74 61 74 34 20 72 65 63 6f 72 64 73 20 2a 2f  stat4 records */
d470: 0a 20 20 20 20 69 6e 74 20 6e 41 76 67 43 6f 6c  .    int nAvgCol
d480: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
d490: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d4a0: 65 6e 74 72 69 65 73 20 69 6e 20 49 6e 64 65 78  entries in Index
d4b0: 2e 61 41 76 67 45 71 20 2a 2f 0a 0a 20 20 20 20  .aAvgEq */..    
d4c0: 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20  char *zIndex;   
d4d0: 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  /* Index name */
d4e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d4f0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
d500: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a  to the index obj
d510: 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ect */.    int n
d520: 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75  Sample;    /* Nu
d530: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
d540: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
d550: 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  ;      /* Bytes 
d560: 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65  of space require
d570: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  d */.    int i; 
d580: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d590: 73 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69  s of space requi
d5a0: 72 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  red */.    tRowc
d5b0: 6e 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20  nt *pSpace;..   
d5c0: 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20   zIndex = (char 
d5d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d5e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
d5f0: 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d  .    if( zIndex=
d600: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
d610: 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c     nSample = sql
d620: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
d630: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70  pStmt, 1);.    p
d640: 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f  Idx = findIndexO
d650: 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62 2c 20  rPrimaryKey(db, 
d660: 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20  zIndex, zDb);.  
d670: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 3d 3d    assert( pIdx==
d680: 30 20 7c 7c 20 62 53 74 61 74 33 20 7c 7c 20 70  0 || bStat3 || p
d690: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20  Idx->nSample==0 
d6a0: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e  );.    /* Index.
d6b0: 6e 53 61 6d 70 6c 65 20 69 73 20 6e 6f 6e 2d 7a  nSample is non-z
d6c0: 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ero at this poin
d6d0: 74 20 69 66 20 64 61 74 61 20 68 61 73 20 61 6c  t if data has al
d6e0: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
d6f0: 2a 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  * loaded from th
d700: 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20 49  e stat4 table. I
d710: 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e 6f  n this case igno
d720: 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20 20  re stat3 data.  
d730: 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d  */.    if( pIdx=
d740: 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d  =0 || pIdx->nSam
d750: 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ple ) continue;.
d760: 20 20 20 20 69 66 28 20 62 53 74 61 74 33 3d 3d      if( bStat3==
d770: 30 20 29 7b 0a 20 20 20 20 20 20 6e 49 64 78 43  0 ){.      nIdxC
d780: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ol = pIdx->nKeyC
d790: 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 6e 41 76 67  ol+1;.      nAvg
d7a0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Col = pIdx->nKey
d7b0: 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Col;.    }.    p
d7c0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
d7d0: 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 6e  = nIdxCol;.    n
d7e0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e  Byte = sizeof(In
d7f0: 64 65 78 53 61 6d 70 6c 65 29 20 2a 20 6e 53 61  dexSample) * nSa
d800: 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20  mple;.    nByte 
d810: 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  += sizeof(tRowcn
d820: 74 29 20 2a 20 6e 49 64 78 43 6f 6c 20 2a 20 33  t) * nIdxCol * 3
d830: 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20   * nSample;.    
d840: 6e 42 79 74 65 20 2b 3d 20 6e 41 76 67 43 6f 6c  nByte += nAvgCol
d850: 20 2a 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e   * sizeof(tRowcn
d860: 74 29 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65  t);     /* Space
d870: 20 66 6f 72 20 49 6e 64 65 78 2e 61 41 76 67 45   for Index.aAvgE
d880: 71 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78  q[] */..    pIdx
d890: 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69  ->aSample = sqli
d8a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
d8b0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
d8c0: 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  if( pIdx->aSampl
d8d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
d8e0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
d8f0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
d900: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 70 61  ;.    }.    pSpa
d920: 63 65 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26  ce = (tRowcnt*)&
d930: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6e 53  pIdx->aSample[nS
d940: 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 49 64 78  ample];.    pIdx
d950: 2d 3e 61 41 76 67 45 71 20 3d 20 70 53 70 61 63  ->aAvgEq = pSpac
d960: 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 41 76  e; pSpace += nAv
d970: 67 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d  gCol;.    for(i=
d980: 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b  0; i<nSample; i+
d990: 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
d9a0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 20  aSample[i].anEq 
d9b0: 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  = pSpace; pSpace
d9c0: 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20   += nIdxCol;.   
d9d0: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
d9e0: 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70 53 70 61 63  [i].anLt = pSpac
d9f0: 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64  e; pSpace += nId
da00: 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78  xCol;.      pIdx
da10: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44  ->aSample[i].anD
da20: 4c 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70  Lt = pSpace; pSp
da30: 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a  ace += nIdxCol;.
da40: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
da50: 28 20 28 28 75 38 2a 29 70 53 70 61 63 65 29 2d  ( ((u8*)pSpace)-
da60: 6e 42 79 74 65 3d 3d 28 75 38 2a 29 28 70 49 64  nByte==(u8*)(pId
da70: 78 2d 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a 20  x->aSample) );. 
da80: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
da90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
daa0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
dab0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71 6c  turn rc;..  zSql
dac0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
dad0: 66 28 64 62 2c 20 7a 53 71 6c 32 2c 20 7a 44 62  f(db, zSql2, zDb
dae0: 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29  );.  if( !zSql )
daf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
db00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
db10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
db20: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
db30: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
db40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
db50: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  db, zSql);.  if(
db60: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
db70: 0a 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ..  while( sqlit
db80: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
db90: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
dba0: 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20    char *zIndex; 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  /* Index name */
dbd0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
dbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbf0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
dc00: 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63   the index objec
dc10: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t */.    int nCo
dc20: 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
dc30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dc40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69   of columns in i
dc50: 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 7a 49 6e  ndex */..    zIn
dc60: 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71  dex = (char *)sq
dc70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
dc80: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
dc90: 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29   if( zIndex==0 )
dca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
dcb0: 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f  Idx = findIndexO
dcc0: 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62 2c 20  rPrimaryKey(db, 
dcd0: 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20  zIndex, zDb);.  
dce0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
dcf0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
dd00: 20 54 68 69 73 20 6e 65 78 74 20 63 6f 6e 64 69   This next condi
dd10: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
dd20: 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79  data has already
dd30: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
dd40: 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71  m .    ** the sq
dd50: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
dd60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
dd70: 67 6e 6f 72 65 20 73 74 61 74 33 20 64 61 74 61  gnore stat3 data
dd80: 2e 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20 3d  .  */.    nCol =
dd90: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f   pIdx->nSampleCo
dda0: 6c 3b 0a 20 20 20 20 69 66 28 20 62 53 74 61 74  l;.    if( bStat
ddb0: 33 20 26 26 20 6e 43 6f 6c 3e 31 20 29 20 63 6f  3 && nCol>1 ) co
ddc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ddd0: 70 49 64 78 21 3d 70 50 72 65 76 49 64 78 20 29  pIdx!=pPrevIdx )
dde0: 7b 0a 20 20 20 20 20 20 69 6e 69 74 41 76 67 45  {.      initAvgE
ddf0: 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20 20 20  q(pPrevIdx);.   
de00: 20 20 20 70 50 72 65 76 49 64 78 20 3d 20 70 49     pPrevIdx = pI
de10: 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  dx;.    }.    pS
de20: 61 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61  ample = &pIdx->a
de30: 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61  Sample[pIdx->nSa
de40: 6d 70 6c 65 5d 3b 0a 20 20 20 20 64 65 63 6f 64  mple];.    decod
de50: 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a  eIntArray((char*
de60: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
de70: 74 65 78 74 28 70 53 74 6d 74 2c 31 29 2c 6e 43  text(pStmt,1),nC
de80: 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71  ol,pSample->anEq
de90: 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f 64  ,0,0);.    decod
dea0: 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a  eIntArray((char*
deb0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
dec0: 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 6e 43  text(pStmt,2),nC
ded0: 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74  ol,pSample->anLt
dee0: 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63 6f 64  ,0,0);.    decod
def0: 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a  eIntArray((char*
df00: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
df10: 74 65 78 74 28 70 53 74 6d 74 2c 33 29 2c 6e 43  text(pStmt,3),nC
df20: 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c  ol,pSample->anDL
df30: 74 2c 30 2c 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  t,0,0);..    /* 
df40: 54 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Take a copy of t
df50: 68 65 20 73 61 6d 70 6c 65 2e 20 41 64 64 20 74  he sample. Add t
df60: 77 6f 20 30 78 30 30 20 62 79 74 65 73 20 74 68  wo 0x00 bytes th
df70: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
df80: 66 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  fer..    ** This
df90: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
dfa0: 73 61 6d 70 6c 65 20 72 65 63 6f 72 64 20 69 73  sample record is
dfb0: 20 63 6f 72 72 75 70 74 65 64 2e 20 49 6e 20 74   corrupted. In t
dfc0: 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 20 20  hat case, the.  
dfd0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
dfe0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
dff0: 6d 61 79 20 72 65 61 64 20 75 70 20 74 6f 20 74  may read up to t
e000: 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
e010: 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
e020: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
e030: 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 69 74  buffer before it
e040: 20 72 65 61 6c 69 7a 65 73 20 69 74 20 69 73 20   realizes it is 
e050: 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 20  dealing with.   
e060: 20 2a 2a 20 61 20 63 6f 72 72 75 70 74 20 72 65   ** a corrupt re
e070: 63 6f 72 64 2e 20 41 64 64 69 6e 67 20 74 68 65  cord. Adding the
e080: 20 74 77 6f 20 30 78 30 30 20 62 79 74 65 73 20   two 0x00 bytes 
e090: 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72  prevents this fr
e0a0: 6f 6d 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  om causing.    *
e0b0: 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
e0c0: 65 61 64 2e 20 20 2a 2f 0a 20 20 20 20 70 53 61  ead.  */.    pSa
e0d0: 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  mple->n = sqlite
e0e0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
e0f0: 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 70 53  Stmt, 4);.    pS
e100: 61 6d 70 6c 65 2d 3e 70 20 3d 20 73 71 6c 69 74  ample->p = sqlit
e110: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e120: 62 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 2b 20  b, pSample->n + 
e130: 32 29 3b 0a 20 20 20 20 69 66 28 20 70 53 61 6d  2);.    if( pSam
e140: 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20  ple->p==0 ){.   
e150: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e160: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
e170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e180: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
e190: 20 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c 65 2d   memcpy(pSample-
e1a0: 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  >p, sqlite3_colu
e1b0: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34  mn_blob(pStmt, 4
e1c0: 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b 0a  ), pSample->n);.
e1d0: 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c      pIdx->nSampl
e1e0: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e++;.  }.  rc = 
e1f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
e200: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
e210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 69  c==SQLITE_OK ) i
e220: 6e 69 74 41 76 67 45 71 28 70 50 72 65 76 49 64  nitAvgEq(pPrevId
e230: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 63  .}../*.** Load c
e250: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
e260: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 6e 64  sqlite_stat4 and
e270: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
e280: 62 6c 65 73 20 69 6e 74 6f 20 0a 2a 2a 20 74 68  bles into .** th
e290: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  e Index.aSample[
e2a0: 5d 20 61 72 72 61 79 73 20 6f 66 20 61 6c 6c 20  ] arrays of all 
e2b0: 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  indices..*/.stat
e2c0: 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61 74 34  ic int loadStat4
e2d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
e2e0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
e2f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e300: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e310: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
e320: 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  s from subroutin
e330: 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
e340: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e350: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
e360: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
e370: 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
e380: 5f 73 74 61 74 34 22 2c 20 7a 44 62 29 20 29 7b  _stat4", zDb) ){
e390: 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74  .    rc = loadSt
e3a0: 61 74 54 62 6c 28 64 62 2c 20 30 2c 0a 20 20 20  atTbl(db, 0,.   
e3b0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63     "SELECT idx,c
e3c0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e  ount(*) FROM %Q.
e3d0: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47 52 4f  sqlite_stat4 GRO
e3e0: 55 50 20 42 59 20 69 64 78 22 2c 20 0a 20 20 20  UP BY idx", .   
e3f0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e     "SELECT idx,n
e400: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
e410: 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  le FROM %Q.sqlit
e420: 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20  e_stat4",.      
e430: 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  zDb.    );.  }..
e440: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e450: 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 46 69  _OK && sqlite3Fi
e460: 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c  ndTable(db, "sql
e470: 69 74 65 5f 73 74 61 74 33 22 2c 20 7a 44 62 29  ite_stat3", zDb)
e480: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61   ){.    rc = loa
e490: 64 53 74 61 74 54 62 6c 28 64 62 2c 20 31 2c 0a  dStatTbl(db, 1,.
e4a0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64        "SELECT id
e4b0: 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  x,count(*) FROM 
e4c0: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 20  %Q.sqlite_stat3 
e4d0: 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20 0a  GROUP BY idx", .
e4e0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64        "SELECT id
e4f0: 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73  x,neq,nlt,ndlt,s
e500: 71 6c 69 74 65 5f 72 65 63 6f 72 64 28 73 61 6d  qlite_record(sam
e510: 70 6c 65 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c  ple) FROM %Q.sql
e520: 69 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20  ite_stat3",.    
e530: 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d    zDb.    );.  }
e540: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
e550: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e560: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e570: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
e580: 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  * Load the conte
e590: 6e 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  nt of the sqlite
e5a0: 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74  _stat1 and sqlit
e5b0: 65 5f 73 74 61 74 33 2f 34 20 74 61 62 6c 65 73  e_stat3/4 tables
e5c0: 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  . The.** content
e5d0: 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  s of sqlite_stat
e5e0: 31 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f  1 are used to po
e5f0: 70 75 6c 61 74 65 20 74 68 65 20 49 6e 64 65 78  pulate the Index
e600: 2e 61 69 52 6f 77 45 73 74 5b 5d 0a 2a 2a 20 61  .aiRowEst[].** a
e610: 72 72 61 79 73 2e 20 54 68 65 20 63 6f 6e 74 65  rrays. The conte
e620: 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nts of sqlite_st
e630: 61 74 33 2f 34 20 61 72 65 20 75 73 65 64 20 74  at3/4 are used t
e640: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a  o populate the.*
e650: 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  * Index.aSample[
e660: 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20  ] arrays..**.** 
e670: 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  If the sqlite_st
e680: 61 74 31 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  at1 table is not
e690: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
e6a0: 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45  database, SQLITE
e6b0: 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20 72 65 74  _ERROR.** is ret
e6c0: 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
e6d0: 61 73 65 2c 20 65 76 65 6e 20 69 66 20 53 51 4c  ase, even if SQL
e6e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e6f0: 2f 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 0a  /4 was defined .
e700: 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  ** during compil
e710: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 71  ation and the sq
e720: 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62  lite_stat3/4 tab
e730: 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e  le is present, n
e740: 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65  o data is .** re
e750: 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a  ad from it..**.*
e760: 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
e770: 4c 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64  LE_STAT3/4 was d
e780: 65 66 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f  efined during co
e790: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
e7a0: 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  e .** sqlite_sta
e7b0: 74 34 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  t4 table is not 
e7c0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
e7d0: 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
e7e0: 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75  ERROR is.** retu
e7f0: 72 6e 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  rned. However, i
e800: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 61 74  n this case, dat
e810: 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  a is read from t
e820: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a  he sqlite_stat1.
e830: 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 69 74 20  ** table (if it 
e840: 69 73 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f  is present) befo
e850: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
e860: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
e870: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
e880: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
e890: 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63   sets db->malloc
e8a0: 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20  Failed..** This 
e8b0: 6d 65 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c  means if the cal
e8c0: 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72  ler does not car
e8d0: 65 20 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72  e about other er
e8e0: 72 6f 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  rors, the return
e8f0: 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20  .** code may be 
e900: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
e910: 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c  sqlite3AnalysisL
e920: 6f 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  oad(sqlite3 *db,
e930: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61   int iDb){.  ana
e940: 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b  lysisInfo sInfo;
e950: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
e960: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
e970: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
e980: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
e990: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
e9a0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
e9b0: 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20  b].pBt!=0 );..  
e9c0: 2f 2a 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69  /* Clear any pri
e9d0: 6f 72 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f  or statistics */
e9e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e9f0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
ea00: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
ea10: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
ea20: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
ea30: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
ea40: 69 64 78 48 61 73 68 29 3b 69 3b 69 3d 73 71 6c  idxHash);i;i=sql
ea50: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
ea60: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
ea70: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
ea80: 61 28 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a(i);.    sqlite
ea90: 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
eaa0: 49 64 78 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Idx);.#ifdef SQL
eab0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
eac0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
ead0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
eae0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 49 64 78  Samples(db, pIdx
eaf0: 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61  );.    pIdx->aSa
eb00: 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  mple = 0;.#endif
eb10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
eb20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
eb30: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
eb40: 61 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  able exists */. 
eb50: 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a   sInfo.db = db;.
eb60: 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73    sInfo.zDatabas
eb70: 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  e = db->aDb[iDb]
eb80: 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71  .zName;.  if( sq
eb90: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
eba0: 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
ebb0: 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61  ", sInfo.zDataba
ebc0: 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  se)==0 ){.    re
ebd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ebe0: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61  R;.  }..  /* Loa
ebf0: 64 20 6e 65 77 20 73 74 61 74 69 73 74 69 63 73  d new statistics
ec00: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 71 6c 69   out of the sqli
ec10: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a  te_stat1 table *
ec20: 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  /.  zSql = sqlit
ec30: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
ec40: 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 62 6c       "SELECT tbl
ec50: 2c 69 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 25  ,idx,stat FROM %
ec60: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  Q.sqlite_stat1",
ec70: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
ec80: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
ec90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
eca0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
ecb0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
ecc0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
ecd0: 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  ql, analysisLoad
ece0: 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a  er, &sInfo, 0);.
ecf0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ed00: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d  e(db, zSql);.  }
ed10: 0a 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ...  /* Load the
ed20: 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
ed30: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
ed40: 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  4 table. */.#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ed60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
ed70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ed80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  _OK ){.    int l
ed90: 6f 6f 6b 61 73 69 64 65 45 6e 61 62 6c 65 64 20  ookasideEnabled 
eda0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
edb0: 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 64 62  bEnabled;.    db
edc0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
edd0: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 63  bled = 0;.    rc
ede0: 20 3d 20 6c 6f 61 64 53 74 61 74 34 28 64 62 2c   = loadStat4(db,
edf0: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
ee00: 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  );.    db->looka
ee10: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
ee20: 6c 6f 6f 6b 61 73 69 64 65 45 6e 61 62 6c 65 64  lookasideEnabled
ee30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
ee40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
ee50: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OMEM ){.    db->
ee60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
ee70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
ee80: 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
ee90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
eea0: 4c 59 5a 45 20 2a 2f 0a                          LYZE */.