/ Hex Artifact Content
Login

Artifact 128f85d9bd7e79e93b8b27aa2bb54a43ad0c00f3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 30 20 61 6e 64 20 6c  ions 3.8.0 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 69 63 73 20 72 65  the statisics re
0730: 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74 68  quired.** for th
0740: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
0750: 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68 6f  to make good cho
0760: 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d  ices..**.** Form
0770: 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  at of sqlite_sta
0780: 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  t1:.**.** There 
0790: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65 20  is normally one 
07a0: 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20 77  row per index, w
07b0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69 64  ith the index id
07c0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 0a  entified by the.
07d0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 69  ** name in the i
07e0: 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  dx column.  The 
07f0: 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  tbl column is th
0800: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0810: 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68 20  ble to.** which 
0820: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0830: 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63 68  s.  In each such
0840: 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20 63   row, the stat c
0850: 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  olumn will be.**
0860: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73   a string consis
0870: 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20 6f  ting of a list o
0880: 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65  f integers.  The
0890: 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
08a0: 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20 69  n this.** list i
08b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
08c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
08d0: 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  x.  (This is the
08e0: 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20   same as the.** 
08f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0900: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78 63  n the table, exc
0910: 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c 20  ept for partial 
0920: 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20 73  indices.)  The s
0930: 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65 72  econd.** integer
0940: 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65 20   is the average 
0950: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
0960: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
0970: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a 2a   have the same.*
0980: 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 66  * value in the f
0990: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
09a0: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74  he index.  The t
09b0: 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73 20  hird integer is 
09c0: 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20 6e  the average.** n
09d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
09e0: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
09f0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
0a00: 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  lue for the firs
0a10: 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  t two.** columns
0a20: 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74 65  .  The N-th inte
0a30: 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69 73  ger (for N>1) is
0a40: 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75 6d   the average num
0a50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
0a60: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68 69  ** the index whi
0a70: 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ch have the same
0a80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66   value for the f
0a90: 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e 73  irst N-1 columns
0aa0: 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63 6f  .  For.** a K-co
0ab0: 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65 72  lumn index, ther
0ac0: 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69 6e  e will be K+1 in
0ad0: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 74  tegers in the st
0ae0: 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a 2a  at column.  If.*
0af0: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75  * the index is u
0b00: 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65 20  nique, then the 
0b10: 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69 6c  last integer wil
0b20: 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  l be 1..**.** Th
0b30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  e list of intege
0b40: 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20 63  rs in the stat c
0b50: 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f 6e  olumn can option
0b60: 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65 64  ally be followed
0b70: 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77 6f  .** by the keywo
0b80: 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e 20  rd "unordered". 
0b90: 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22   The "unordered"
0ba0: 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74 20   keyword, if it 
0bb0: 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20 6d  is present,.** m
0bc0: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 64  ust be separated
0bd0: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 69   from the last i
0be0: 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e 67  nteger by a sing
0bf0: 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74 68  le space.  If th
0c00: 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64 22  e.** "unordered"
0c10: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0c20: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71 75  ent, then the qu
0c30: 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  ery planner assu
0c40: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
0c50: 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65 72  index is unorder
0c60: 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  ed and will not 
0c70: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66 6f  use the index fo
0c80: 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79 2e  r a range query.
0c90: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
0ca0: 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78 20  qlite_stat1.idx 
0cb0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c 20  column is NULL, 
0cc0: 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
0cd0: 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63 6f  stat1.stat.** co
0ce0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
0cf0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 77  single integer w
0d00: 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73 74  hich is the (est
0d10: 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20 6f  imated) number o
0d20: 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65  f.** rows in the
0d30: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
0d40: 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61 74  d by sqlite_stat
0d50: 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  1.tbl..**.** For
0d60: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0d70: 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  at2:.**.** The s
0d80: 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6f  qlite_stat2 is o
0d90: 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 20  nly created and 
0da0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
0db0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
0dc0: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
0dd0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 61  E_ENABLE_STAT2 a
0de0: 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  nd if the SQLite
0df0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
0e00: 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33 2e  is between.** 3.
0e10: 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e 20  6.18 and 3.7.8. 
0e20: 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61 62   The "stat2" tab
0e30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  le contains addi
0e40: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
0e50: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  on.** about the 
0e60: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 20  distribution of 
0e70: 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20 69  keys within an i
0e80: 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65 78  ndex.  The index
0e90: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
0ea0: 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20 63  y.** the "idx" c
0eb0: 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22 74  olumn and the "t
0ec0: 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  bl" column is th
0ed0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0ee0: 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a 20  ble to which.** 
0ef0: 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
0f00: 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75 73  s.  There are us
0f10: 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69 6e  ually 10 rows in
0f20: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0f30: 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20 65  2.** table for e
0f40: 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ach index..**.**
0f50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0f60: 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6e  2 entries for an
0f70: 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76 65   index that have
0f80: 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65 65   sampleno betwee
0f90: 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e 63  n 0 and 9.** inc
0fa0: 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70 6c  lusive are sampl
0fb0: 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  es of the left-m
0fc0: 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69 6e  ost key value in
0fd0: 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65 6e   the index taken
0fe0: 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73 70   at.** evenly sp
0ff0: 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f 6e  aced points alon
1000: 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c 65  g the index.  Le
1010: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1020: 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a 20  samples be S.** 
1030: 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e 64  (10 in the stand
1040: 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20 6c  ard build) and l
1050: 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d 62  et C be the numb
1060: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1070: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 6e  e index..** Then
1080: 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f 77   the sampled row
1090: 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a 0a  s are given by:.
10a0: 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75 6d  **.**     rownum
10b0: 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20 43  ber = (i*C*2 + C
10c0: 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46 6f  )/(S*2).**.** Fo
10d0: 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61 6e  r i between 0 an
10e0: 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74 75  d S-1.  Conceptu
10f0: 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78 20  ally, the index 
1100: 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65 64  space is divided
1110: 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66 6f   into.** S unifo
1120: 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20 74  rm buckets and t
1130: 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20 74  he samples are t
1140: 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66 72  he middle row fr
1150: 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e 0a  om each bucket..
1160: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
1170: 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74   for sqlite_stat
1180: 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68 65  2 is recorded he
1190: 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72 65  re for legacy re
11a0: 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a 2a  ference.  This.*
11b0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  * version of SQL
11c0: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ite does not sup
11d0: 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61 74  port sqlite_stat
11e0: 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20 72  2.  It neither r
11f0: 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69 74  eads nor.** writ
1200: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  es the sqlite_st
1210: 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69 73  at2 table.  This
1220: 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69   version of SQLi
1230: 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  te only supports
1240: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33  .** sqlite_stat3
1250: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1260: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 3a  or sqlite_stat3:
1270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
1280: 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20 69  e_stat3 format i
1290: 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73 71  s a subset of sq
12a0: 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65 6e  lite_stat4.  Hen
12b0: 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ce, the.** sqlit
12c0: 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20 77  e_stat4 format w
12d0: 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65 64  ill be described
12e0: 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65 72   first.  Further
12f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1300: 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74 61  about sqlite_sta
1310: 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73  t3 follows the s
1320: 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73 63  qlite_stat4 desc
1330: 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ription..**.** F
1340: 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65  ormat for sqlite
1350: 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41 73  _stat4:.**.** As
1360: 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74 61   with sqlite_sta
1370: 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f 73  t2, the sqlite_s
1380: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1390: 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64 61  ins histogram da
13a0: 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68 65  ta.** to aid the
13b0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69   query planner i
13c0: 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64 20  n choosing good 
13d0: 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f 6e  indices based on
13e0: 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 74   the values.** t
13f0: 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  hat indexed colu
1400: 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  mns are compared
1410: 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65 20   against in the 
1420: 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f 66  WHERE clauses of
1430: 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  .** queries..**.
1440: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  ** The sqlite_st
1450: 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  at4 table contai
1460: 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74 72  ns multiple entr
1470: 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ies for each ind
1480: 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20 63  ex..** The idx c
1490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65 20  olumn names the 
14a0: 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74 62  index and the tb
14b0: 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  l column is the 
14c0: 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20  table of the.** 
14d0: 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 69  index.  If the i
14e0: 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75 6d  dx and tbl colum
14f0: 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2c  ns are the same,
1500: 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c 65   then the sample
1510: 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e   is.** of the IN
1520: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1530: 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20 63  Y.  The sample c
1540: 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62 20  olumn is a blob 
1550: 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20  which is the.** 
1560: 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67 20  binary encoding 
1570: 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  of a key from th
1580: 65 20 69 6e 64 65 78 2c 20 77 69 74 68 20 74 68  e index, with th
1590: 65 20 74 72 61 69 6c 69 6e 67 20 72 6f 77 69 64  e trailing rowid
15a0: 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 20 20 54 68  .** omitted.  Th
15b0: 65 20 6e 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20  e nEq column is 
15c0: 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  a list of intege
15d0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15e0: 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
15f0: 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d   approximate num
1600: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1610: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1620: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 0a 2a 2a 20  e left-most .** 
1630: 63 6f 6c 75 6d 6e 20 65 78 61 63 74 6c 79 20 6d  column exactly m
1640: 61 74 63 68 65 73 20 74 68 65 20 6c 65 66 74 2d  atches the left-
1650: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
1660: 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  he sample.  The 
1670: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
1680: 72 20 69 6e 20 6e 45 71 20 69 73 20 74 68 65 20  r in nEq is the 
1690: 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62  approximate numb
16a0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16b0: 20 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65   the index where
16c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
16d0: 6f 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  o columns match 
16e0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f  the first two co
16f0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  lumns of the sam
1700: 70 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  ple..** And so f
1710: 6f 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e  orth.  nLt is an
1720: 6f 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e  other list of in
1730: 74 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77  tegers that show
1740: 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
1750: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  .** number of en
1760: 74 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73  tries that are s
1770: 74 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61  trictly less tha
1780: 6e 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54  n the sample.  T
1790: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65  he first.** inte
17a0: 67 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61  ger in nLt conta
17b0: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
17c0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
17d0: 20 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65   index where the
17e0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
17f0: 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61  lumn is less tha
1800: 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
1810: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61  column of the sa
1820: 6d 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74  mple..** The K-t
1830: 68 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  h integer in the
1840: 20 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68   nLt entry is th
1850: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
1860: 78 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68  x entries .** wh
1870: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20  ere the first K 
1880: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73  columns are less
1890: 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
18a0: 4b 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  K columns of the
18b0: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65  .** sample.  The
18c0: 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20   nDLt column is 
18d0: 6c 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20  like nLt except 
18e0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
18f0: 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
1900: 6f 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72  of distinct entr
1910: 69 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ies in the index
1920: 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
1930: 68 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c  han the.** sampl
1940: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63  e..**.** There c
1950: 61 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61  an be an arbitra
1960: 72 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c  ry number of sql
1970: 69 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65  ite_stat4 entrie
1980: 73 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20  s per index..** 
1990: 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  The ANALYZE comm
19a0: 61 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c  and will typical
19b0: 6c 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69  ly generate sqli
19c0: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a  te_stat4 tables.
19d0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ** that contain 
19e0: 62 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34  between 10 and 4
19f0: 30 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20  0 samples which 
1a00: 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
1a10: 61 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65  across.** the ke
1a20: 79 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20  y space, though 
1a30: 6e 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61  not uniformly, a
1a40: 6e 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65  nd which include
1a50: 20 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a   samples with.**
1a60: 20 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65   large nEq value
1a70: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  s..**.** Format 
1a80: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1a90: 20 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68   redux:.**.** Th
1aa0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  e sqlite_stat3 t
1ab0: 61 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c  able is like sql
1ac0: 69 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74  ite_stat4 except
1ad0: 20 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a   that it only.**
1ae0: 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65   looks at the le
1af0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
1b00: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68  f the index.  Th
1b10: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73  e sqlite_stat3.s
1b20: 61 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ample.** column 
1b30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74  contains the act
1b40: 75 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ual value of the
1b50: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1b60: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
1b70: 61 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20  a blob encoding 
1b80: 6f 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  of the complete 
1b90: 69 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20  index key as is 
1ba0: 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69  found in.** sqli
1bb0: 74 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e  te_stat4.sample.
1bc0: 20 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20    The nEq, nLt, 
1bd0: 61 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73  and nDLt entries
1be0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
1bf0: 0a 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20  .** all contain 
1c00: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e  just a single in
1c10: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1c20: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66  he same as the f
1c30: 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20  irst.** integer 
1c40: 69 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  in the equivalen
1c50: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c  t columns in sql
1c60: 69 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69  ite_stat4..*/.#i
1c70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c80: 54 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75  T_ANALYZE.#inclu
1c90: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
1ca0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cc0: 34 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  4).# define IsSt
1cd0: 61 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69  at4     1.# defi
1ce0: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30  ne IsStat3     0
1cf0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1d10: 54 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53  T3).# define IsS
1d20: 74 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66  tat4     0.# def
1d30: 69 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20  ine IsStat3     
1d40: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1d50: 20 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23   IsStat4     0.#
1d60: 20 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20   define IsStat3 
1d70: 20 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51      0.# undef SQ
1d80: 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c  LITE_STAT4_SAMPL
1d90: 45 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  ES.# define SQLI
1da0: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
1db0: 20 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e   1.#endif.#defin
1dc0: 65 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49  e IsStat34    (I
1dd0: 73 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20  sStat3+IsStat4) 
1de0: 20 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20   /* 1 for STAT3 
1df0: 6f 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65  or STAT4. 0 othe
1e00: 72 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rwise */../*.** 
1e10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
1e20: 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1e30: 20 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74   opens the sqlit
1e40: 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a  e_statN tables..
1e50: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  ** The sqlite_st
1e60: 61 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77  at1 table is alw
1e70: 61 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73  ays relevant.  s
1e80: 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e  qlite_stat2 is n
1e90: 6f 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20  ow.** obsolete. 
1ea0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
1eb0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61  d sqlite_stat4 a
1ec0: 72 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77  re only opened w
1ed0: 68 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  hen.** appropria
1ee0: 74 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  te compile-time 
1ef0: 6f 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76  options are prov
1f00: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ided..**.** If t
1f10: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
1f20: 74 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72  tables do not pr
1f30: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20  eviously exist, 
1f40: 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
1f50: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57  *.** Argument zW
1f60: 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f  here may be a po
1f70: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1f80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  r containing a t
1f90: 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72  able name,.** or
1fa0: 20 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c   it may be a NUL
1fb0: 4c 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  L pointer. If it
1fc0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1fd0: 65 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  en all entries i
1fe0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
1ff0: 73 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73  statN tables ass
2000: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2010: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65   named table are
2020: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
2030: 7a 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20  zWhere==0, then 
2040: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
2050: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
2060: 73 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69  stat table entri
2070: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
2080: 69 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65  id openStatTable
2090: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20a0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20c0: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61  he database we a
20f0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f  re looking in */
2100: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c  .  int iStatCur,
2110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2120: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  en the sqlite_st
2130: 61 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69  at1 table on thi
2140: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2150: 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
2160: 2c 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ,     /* Delete 
2170: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73  entries for this
2180: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2190: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21a0: 2a 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20  *zWhereType  /* 
21b0: 45 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20  Either "tbl" or 
21c0: 22 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74  "idx" */.){.  st
21d0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
21e0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
21f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73  onst char *zCols
2210: 3b 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d  ;.  } aTable[] =
2220: 20 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65   {.    { "sqlite
2230: 5f 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64  _stat1", "tbl,id
2240: 78 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64  x,stat" },.#if d
2250: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2260: 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20  ABLE_STAT4).    
2270: 7b 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  { "sqlite_stat4"
2280: 2c 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e  , "tbl,idx,neq,n
2290: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20  lt,ndlt,sample" 
22a0: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
22b0: 5f 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65  _stat3", 0 },.#e
22c0: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
22d0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
22e0: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
22f0: 74 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat3", "tbl,idx,
2300: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d  neq,nlt,ndlt,sam
2310: 70 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73  ple" },.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20  qlite_stat4", 0 
2330: 7d 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22  },.#else.    { "
2340: 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30  sqlite_stat3", 0
2350: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74   },.    { "sqlit
2360: 65 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23  e_stat4", 0 },.#
2370: 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74  endif.  };.  int
2380: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
2390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23a0: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62    Db *pDb;.  Vdb
23b0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
23c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
23d0: 20 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79   int aRoot[Array
23e0: 53 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20  Size(aTable)];. 
23f0: 20 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41   u8 aCreateTbl[A
2400: 72 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29  rraySize(aTable)
2410: 5d 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  ];..  if( v==0 )
2420: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
2430: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2440: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
2450: 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
2460: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
2470: 3d 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20  ==db );.  pDb = 
2480: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
2490: 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20    /* Create new 
24a0: 73 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73  statistic tables
24b0: 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
24c0: 65 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20  exist, or clear 
24d0: 74 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65  them.  ** if the
24e0: 79 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69  y do already exi
24f0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  st..  */.  for(i
2500: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2510: 61 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20  aTable); i++){. 
2520: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2530: 54 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e  Tab = aTable[i].
2540: 7a 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65  zName;.    Table
2550: 20 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28   *pStat;.    if(
2560: 20 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65   (pStat = sqlite
2570: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
2580: 54 61 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  Tab, pDb->zName)
2590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
25a0: 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c  ( aTable[i].zCol
25b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
25c0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  The sqlite_statN
25d0: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
25e0: 65 78 69 73 74 2e 20 43 72 65 61 74 65 20 69 74  exist. Create it
25f0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20  . Note that a . 
2600: 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65         ** side-e
2610: 66 66 65 63 74 20 6f 66 20 74 68 65 20 43 52 45  ffect of the CRE
2620: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2630: 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20  ent is to leave 
2640: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20  the rootpage .  
2650: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2660: 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67  new table in reg
2670: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
2680: 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69  gRoot. This is i
2690: 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20  mportant .      
26a0: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
26b0: 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64   OpenWrite opcod
26c0: 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20  e below will be 
26d0: 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20  needing it. */. 
26e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
26f0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
2700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
2710: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25  REATE TABLE %Q.%
2720: 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61  s(%s)", pDb->zNa
2730: 6d 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65  me, zTab, aTable
2740: 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20  [i].zCols.      
2750: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 52 6f    );.        aRo
2760: 6f 74 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  ot[i] = pParse->
2770: 72 65 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20  regRoot;.       
2780: 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d   aCreateTbl[i] =
2790: 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3b   OPFLAG_P2ISREG;
27a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
27b0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
27c0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
27d0: 78 69 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65  xists. If zWhere
27e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65   is not NULL, de
27f0: 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  lete all entries
2800: 20 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63   .      ** assoc
2810: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
2820: 61 62 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20  able zWhere. If 
2830: 7a 57 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20  zWhere is NULL, 
2840: 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2850: 20 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65   ** entire conte
2860: 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  nts of the table
2870: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74  . */.      aRoot
2880: 5b 69 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75  [i] = pStat->tnu
2890: 6d 3b 0a 20 20 20 20 20 20 61 43 72 65 61 74 65  m;.      aCreate
28a0: 54 62 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Tbl[i] = 0;.    
28b0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
28c0: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
28d0: 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54 61  aRoot[i], 1, zTa
28e0: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 57  b);.      if( zW
28f0: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  here ){.        
2900: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
2910: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
2920: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
2930: 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
2940: 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20  s=%Q",.         
2950: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54    pDb->zName, zT
2960: 61 62 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20  ab, zWhereType, 
2970: 7a 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 29  zWhere.        )
2980: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2990: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71         /* The sq
29a0: 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74  lite_stat[134] t
29b0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
29c0: 73 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c  sts.  Delete all
29d0: 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
29e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29f0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
2a00: 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b   aRoot[i], iDb);
2a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a20: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
2a30: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33  e sqlite_stat[13
2a40: 34 5d 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72  4] tables for wr
2a50: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28  iting. */.  for(
2a60: 69 3d 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  i=0; aTable[i].z
2a70: 43 6f 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cols; i++){.    
2a80: 61 73 73 65 72 74 28 20 69 3c 41 72 72 61 79 53  assert( i<ArrayS
2a90: 69 7a 65 28 61 54 61 62 6c 65 29 20 29 3b 0a 20  ize(aTable) );. 
2aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ab0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
2ac0: 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69  rite, iStatCur+i
2ad0: 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29  , aRoot[i], iDb)
2ae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2af0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
2b00: 20 28 63 68 61 72 20 2a 29 33 2c 20 50 34 5f 49   (char *)3, P4_I
2b10: 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  NT32);.    sqlit
2b20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2b30: 2c 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29  , aCreateTbl[i])
2b40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2b50: 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65  ecommended numbe
2b60: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72  r of samples for
2b70: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f   sqlite_stat4.*/
2b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b90: 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20  STAT4_SAMPLES.# 
2ba0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54  define SQLITE_ST
2bb0: 41 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23  AT4_SAMPLES 24.#
2bc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72  endif../*.** Thr
2bd0: 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ee SQL functions
2be0: 20 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20   - stat_init(), 
2bf0: 73 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64  stat_push(), and
2c00: 20 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a   stat_get() -.**
2c10: 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e   share an instan
2c20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f  ing structure to
2c40: 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74   hold their stat
2c50: 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  e.** information
2c60: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c70: 75 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53  uct Stat4Accum S
2c80: 74 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64  tat4Accum;.typed
2c90: 65 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53  ef struct Stat4S
2ca0: 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c  ample Stat4Sampl
2cb0: 65 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53  e;.struct Stat4S
2cc0: 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e  ample {.  tRowcn
2cd0: 74 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20  t *anEq;        
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2cf0: 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f  ite_stat4.nEq */
2d00: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c  .  tRowcnt *anDL
2d10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d20: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2d30: 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65  t4.nDLt */.#ifde
2d40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d50: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2d60: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20   tRowcnt *anLt; 
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2d90: 2e 6e 4c 74 20 2a 2f 0a 20 20 69 36 34 20 69 52  .nLt */.  i64 iR
2da0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2dc0: 69 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65  id in main table
2dd0: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
2de0: 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b 20 20   u8 isPSample;  
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 65   /* True if a pe
2e10: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a 2f  riodic sample */
2e20: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53 61 6d     /* If !isPSam
2e50: 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f 6e 20  ple, the reason 
2e60: 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a 2f  for inclusion */
2e70: 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20 20 20  .  u32 iHash;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b 65 72     /* Tiebreaker
2ea0: 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69 66 0a   hash */.#endif.
2eb0: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 0a 73 74 72 75 63 74 20 53 74        .struct St
2ef0: 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74 52 6f  at4Accum {.  tRo
2f00: 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20  wcnt nRow;      
2f10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f20: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2f30: 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
2f40: 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61 6d 70    tRowcnt nPSamp
2f50: 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  le;         /* H
2f60: 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f 20 61  ow often to do a
2f70: 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65   periodic sample
2f80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2fb0: 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2b 20  umns in index + 
2fc0: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  rowid */.  int m
2fd0: 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  xSample;        
2fe0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2ff0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
3000: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
3010: 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  */.  Stat4Sample
3020: 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f   current;      /
3030: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73  * Current row as
3040: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a   a Stat4Sample *
3050: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
3080: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
3090: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61  ampling */.  Sta
30a0: 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b  t4Sample *aBest;
30b0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
30c0: 6f 66 20 28 6e 43 6f 6c 2d 31 29 20 62 65 73 74  of (nCol-1) best
30d0: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e   samples */.  in
30e0: 74 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20  t iMin;         
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3100: 20 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79   in a[] of entry
3110: 20 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63   with minimum sc
3120: 6f 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  ore */.  int nSa
3130: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
3140: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
3150: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
3160: 2a 2f 0a 20 20 69 6e 74 20 69 47 65 74 3b 20 20  */.  int iGet;  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3180: 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65  * Index of curre
3190: 6e 74 20 73 61 6d 70 6c 65 20 61 63 63 65 73 73  nt sample access
31a0: 65 64 20 62 79 20 73 74 61 74 5f 67 65 74 28 29  ed by stat_get()
31b0: 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c   */.  Stat4Sampl
31c0: 65 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  e *a;           
31d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 78 53 61  /* Array of mxSa
31e0: 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c 65  mple Stat4Sample
31f0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
3200: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3210: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
3220: 5f 69 6e 69 74 28 4e 2c 43 29 20 53 51 4c 20 66  _init(N,C) SQL f
3230: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 74 77 6f  unction. The two
3240: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3250: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
3260: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
3270: 6c 65 20 6f 72 20 69 6e 64 65 78 20 28 43 29 20  le or index (C) 
3280: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
3290: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
32a0: 74 68 65 20 69 6e 64 65 78 20 28 4e 29 2e 20 20  the index (N).  
32b0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
32c0: 65 6e 74 20 28 43 29 20 69 73 20 6f 6e 6c 79 20  ent (C) is only 
32d0: 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20 61  used for STAT3 a
32e0: 6e 64 20 53 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20  nd STAT4..**.** 
32f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
3300: 6f 63 61 74 65 73 20 74 68 65 20 53 74 61 74 34  ocates the Stat4
3310: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 69 6e 20  Accum object in 
3320: 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 65  heap memory. The
3330: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 76 61 6c 75   return .** valu
3340: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
3350: 6f 20 74 68 65 20 74 68 65 20 53 74 61 74 34 41  o the the Stat4A
3360: 63 63 75 6d 20 6f 62 6a 65 63 74 20 65 6e 63 6f  ccum object enco
3370: 64 65 64 20 61 73 20 61 20 62 6c 6f 62 20 28 69  ded as a blob (i
3380: 2e 65 2e 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65  .e. .** the size
3390: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 73 20   of the blob is 
33a0: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 62 79  sizeof(void*) by
33b0: 74 65 73 29 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tes). .*/.static
33c0: 20 76 6f 69 64 20 73 74 61 74 49 6e 69 74 28 0a   void statInit(.
33d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
33e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
33f0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3400: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3410: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
3420: 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  p;.  int nCol;  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3450: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
3460: 65 78 20 62 65 69 6e 67 20 73 61 6d 70 6c 65 64  ex being sampled
3470: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70   */.  int nColUp
3480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3490: 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f        /* nCol ro
34a0: 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c 69  unded up for ali
34b0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  gnment */.  int 
34c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
34e0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
34f0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 23 69 66   allocate */.#if
3500: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3510: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
3520: 0a 20 20 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20  .  int mxSample 
3530: 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53  = SQLITE_STAT4_S
3540: 41 4d 50 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a  AMPLES;.#endif..
3550: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
3560: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 20 61  three function a
3570: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e  rguments */.  UN
3580: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3590: 72 67 63 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73  rgc);.  nCol = s
35a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
35b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73  (argv[0]);.  ass
35c0: 65 72 74 28 20 6e 43 6f 6c 3e 31 20 29 3b 20 20  ert( nCol>1 );  
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e0: 3e 31 20 62 65 63 61 75 73 65 20 69 74 20 69 6e  >1 because it in
35f0: 63 6c 75 64 65 73 20 74 68 65 20 72 6f 77 69 64  cludes the rowid
3600: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 43 6f   column */.  nCo
3610: 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f  lUp = sizeof(tRo
3620: 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b  wcnt)<8 ? (nCol+
3630: 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 0a 20  1)&~1 : nCol;.. 
3640: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
3650: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
3660: 66 6f 72 20 74 68 65 20 53 74 61 74 34 41 63 63  for the Stat4Acc
3670: 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6e  um object */.  n
3680: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 0a 20   = sizeof(*p) . 
3690: 20 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77     + sizeof(tRow
36a0: 63 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20  cnt)*nColUp     
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c0: 53 74 61 74 34 41 63 63 75 6d 2e 61 6e 45 71 20  Stat4Accum.anEq 
36d0: 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  */.    + sizeof(
36e0: 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70 20  tRowcnt)*nColUp 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 61   /* Stat4Accum.a
3710: 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65 66 20 53  nDLt */.#ifdef S
3720: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
3730: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
3740: 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  + sizeof(tRowcnt
3750: 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20  )*nColUp        
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
3770: 74 34 41 63 63 75 6d 2e 61 6e 4c 74 20 2a 2f 0a  t4Accum.anLt */.
3780: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 53 74 61      + sizeof(Sta
3790: 74 34 53 61 6d 70 6c 65 29 2a 28 6e 43 6f 6c 2b  t4Sample)*(nCol+
37a0: 6d 78 53 61 6d 70 6c 65 29 20 20 20 2f 2a 20 53  mxSample)   /* S
37b0: 74 61 74 34 41 63 63 75 6d 2e 61 42 65 73 74 5b  tat4Accum.aBest[
37c0: 5d 2c 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20  ], a[] */.    + 
37d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
37e0: 33 2a 6e 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d  3*nColUp*(nCol+m
37f0: 78 53 61 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a  xSample).#endif.
3800: 20 20 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    ;.  p = sqlite
3810: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 29 3b 0a  3MallocZero(n);.
3820: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
3830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3840: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
3850: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
3860: 6e 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 52 6f  n;.  }..  p->nRo
3870: 77 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  w = 0;.  p->nCol
3880: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 70 2d 3e 63 75   = nCol;.  p->cu
3890: 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d 20 28 74  rrent.anDLt = (t
38a0: 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20  Rowcnt*)&p[1];. 
38b0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
38c0: 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e 61   = &p->current.a
38d0: 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a 23  nDLt[nColUp];..#
38e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
38f0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3900: 54 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70  T4.  {.    u8 *p
3910: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
3930: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e 6f  located space no
3940: 74 20 79 65 74 20 61 73 73 69 67 6e 65 64 20 2a  t yet assigned *
3950: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
3980: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3990: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f   p->aSample[] */
39a0: 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20  ..    p->iGet = 
39b0: 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61 6d  -1;.    p->mxSam
39c0: 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b 0a  ple = mxSample;.
39d0: 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65 20      p->nPSample 
39e0: 3d 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c 69  = (tRowcnt)(sqli
39f0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3a00: 61 72 67 76 5b 31 5d 29 2f 28 6d 78 53 61 6d 70  argv[1])/(mxSamp
3a10: 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20 20  le/3+1) + 1);.  
3a20: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c    p->current.anL
3a30: 74 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e  t = &p->current.
3a40: 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20 20  anEq[nColUp];.  
3a50: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
3a60: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 2d 3e 69  ness(sizeof(p->i
3a70: 50 72 6e 29 2c 20 26 70 2d 3e 69 50 72 6e 29 3b  Prn), &p->iPrn);
3a80: 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  .  .    /* Set u
3a90: 70 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d  p the Stat4Accum
3aa0: 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d  .a[] and aBest[]
3ab0: 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20 20 70   arrays */.    p
3ac0: 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20 53 74  ->a = (struct St
3ad0: 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63  at4Sample*)&p->c
3ae0: 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c  urrent.anLt[nCol
3af0: 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73  Up];.    p->aBes
3b00: 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70  t = &p->a[mxSamp
3b10: 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63 65 20  le];.    pSpace 
3b20: 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78  = (u8*)(&p->a[mx
3b30: 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20  Sample+nCol]);. 
3b40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d     for(i=0; i<(m
3b50: 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69  xSample+nCol); i
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  ++){.      p->a[
3b70: 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f 77 63  i].anEq = (tRowc
3b80: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
3b90: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
3ba0: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70  Rowcnt) * nColUp
3bb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  );.      p->a[i]
3bc0: 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74  .anLt = (tRowcnt
3bd0: 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63   *)pSpace; pSpac
3be0: 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f  e += (sizeof(tRo
3bf0: 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b  wcnt) * nColUp);
3c00: 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61  .      p->a[i].a
3c10: 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20  nDLt = (tRowcnt 
3c20: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
3c30: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
3c40: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
3c50: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3c60: 28 20 28 70 53 70 61 63 65 20 2d 20 28 75 38 2a  ( (pSpace - (u8*
3c70: 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20  )p)==n );.  .   
3c80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
3ca0: 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d  >aBest[i].iCol =
3cb0: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   i;.    }.  }.#e
3cc0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ndif..  /* Retur
3cd0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3ce0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  he allocated obj
3cf0: 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ect to the calle
3d00: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72  r */.  sqlite3_r
3d10: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
3d20: 78 74 2c 20 70 2c 20 73 69 7a 65 6f 66 28 70 29  xt, p, sizeof(p)
3d30: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
3d40: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
3d50: 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74  FuncDef statInit
3d60: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b  Funcdef = {.  1+
3d70: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
3d80: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
3d90: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
3da0: 69 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c  iPrefEnc */.  0,
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dc0: 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  * flags */.  0, 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3de0: 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20   pUserData */.  
3df0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3e00: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73   /* pNext */.  s
3e10: 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20 20 20  tatInit,        
3e20: 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c  /* xFunc */.  0,
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e40: 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20  * xStep */.  0, 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e60: 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20   xFinalize */.  
3e70: 22 73 74 61 74 5f 69 6e 69 74 22 2c 20 20 20 20  "stat_init",    
3e80: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30   /* zName */.  0
3e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ea0: 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 30 20  /* pHash */.  0 
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ec0: 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  * pDestructor */
3ed0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
3ee0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3ef0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52  OR_STAT4./*.** R
3f00: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 4e  eturn true if pN
3f10: 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66  ew is to be pref
3f20: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
3f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3f40: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 53 74  ampleIsBetter(St
3f50: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77 2c  at4Sample *pNew,
3f60: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f   Stat4Sample *pO
3f70: 6c 64 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  ld){.  tRowcnt n
3f80: 45 71 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e  EqNew = pNew->an
3f90: 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a  Eq[pNew->iCol];.
3fa0: 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64    tRowcnt nEqOld
3fb0: 20 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f   = pOld->anEq[pO
3fc0: 6c 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73  ld->iCol];..  as
3fd0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53  sert( pOld->isPS
3fe0: 61 6d 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77  ample==0 && pNew
3ff0: 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29  ->isPSample==0 )
4000: 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 53 74  ;.  assert( IsSt
4010: 61 74 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43  at4 || (pNew->iC
4020: 6f 6c 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69  ol==0 && pOld->i
4030: 43 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66  Col==0) );..  if
4040: 28 20 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64  ( (nEqNew>nEqOld
4050: 29 0a 20 20 20 7c 7c 20 28 6e 45 71 4e 65 77 3d  ).   || (nEqNew=
4060: 3d 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d  =nEqOld && pNew-
4070: 3e 69 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c  >iCol<pOld->iCol
4080: 29 0a 20 20 20 7c 7c 20 28 6e 45 71 4e 65 77 3d  ).   || (nEqNew=
4090: 3d 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77 2d  =nEqOld && pNew-
40a0: 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f  >iCol==pOld->iCo
40b0: 6c 20 26 26 20 70 4e 65 77 2d 3e 69 48 61 73 68  l && pNew->iHash
40c0: 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 29 0a 20 20  >pOld->iHash).  
40d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
40e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
40f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
4100: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
4110: 62 6a 65 63 74 20 28 2a 70 46 72 6f 6d 29 20 69  bject (*pFrom) i
4120: 6e 74 6f 20 28 2a 70 54 6f 29 2e 0a 2a 2f 0a 76  nto (*pTo)..*/.v
4130: 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70 79 28 53  oid sampleCopy(S
4140: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74  tat4Accum *p, St
4150: 61 74 34 53 61 6d 70 6c 65 20 2a 70 54 6f 2c 20  at4Sample *pTo, 
4160: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 46 72  Stat4Sample *pFr
4170: 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69 52 6f 77  om){.  pTo->iRow
4180: 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 52 6f 77  id = pFrom->iRow
4190: 69 64 3b 0a 20 20 70 54 6f 2d 3e 69 73 50 53 61  id;.  pTo->isPSa
41a0: 6d 70 6c 65 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  mple = pFrom->is
41b0: 50 53 61 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d 3e  PSample;.  pTo->
41c0: 69 43 6f 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69 43  iCol = pFrom->iC
41d0: 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69 48 61 73 68  ol;.  pTo->iHash
41e0: 20 3d 20 70 46 72 6f 6d 2d 3e 69 48 61 73 68 3b   = pFrom->iHash;
41f0: 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
4200: 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45 71  nEq, pFrom->anEq
4210: 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74  , sizeof(tRowcnt
4220: 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65  )*p->nCol);.  me
4230: 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c 20  mcpy(pTo->anLt, 
4240: 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69 7a  pFrom->anLt, siz
4250: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e  eof(tRowcnt)*p->
4260: 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  nCol);.  memcpy(
4270: 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20 70 46 72 6f  pTo->anDLt, pFro
4280: 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69 7a 65 6f 66  m->anDLt, sizeof
4290: 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f  (tRowcnt)*p->nCo
42a0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  l);.}../*.** Cop
42b0: 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
42c0: 66 20 73 61 6d 70 6c 65 20 2a 70 4e 65 77 20 69  f sample *pNew i
42d0: 6e 74 6f 20 74 68 65 20 70 2d 3e 61 5b 5d 20 61  nto the p->a[] a
42e0: 72 72 61 79 2e 20 49 66 20 6e 65 63 65 73 73 61  rray. If necessa
42f0: 72 79 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ry,.** remove th
4300: 65 20 6c 65 61 73 74 20 64 65 73 69 72 61 62 6c  e least desirabl
4310: 65 20 73 61 6d 70 6c 65 20 66 72 6f 6d 20 70 2d  e sample from p-
4320: 3e 61 5b 5d 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  >a[] to make roo
4330: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
4340: 64 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 53  d sampleInsert(S
4350: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74  tat4Accum *p, St
4360: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77 2c  at4Sample *pNew,
4370: 20 69 6e 74 20 6e 45 71 5a 65 72 6f 29 7b 0a 20   int nEqZero){. 
4380: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 53   Stat4Sample *pS
4390: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  ample;.  int i;.
43a0: 20 20 69 36 34 20 69 53 65 71 3b 0a 20 20 69 6e    i64 iSeq;.  in
43b0: 74 20 69 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  t iPos;..  asser
43c0: 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20 6e 45  t( IsStat4 || nE
43d0: 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 20 20 69  qZero==0 );..  i
43e0: 66 28 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d 70  f( pNew->isPSamp
43f0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 61  le==0 ){.    Sta
4400: 74 34 53 61 6d 70 6c 65 20 2a 70 55 70 67 72 61  t4Sample *pUpgra
4410: 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
4420: 72 74 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70  rt( pNew->anEq[p
4430: 4e 65 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a  New->iCol]>0 );.
4440: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 61 6d  .    /* This sam
4450: 70 6c 65 20 69 73 20 62 65 69 6e 67 20 61 64 64  ple is being add
4460: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ed because the p
4470: 72 65 66 69 78 20 74 68 61 74 20 65 6e 64 73 20  refix that ends 
4480: 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a  in column .    *
4490: 2a 20 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d 61  * iCol occurs ma
44a0: 6e 79 20 74 69 6d 65 73 20 69 6e 20 74 68 65 20  ny times in the 
44b0: 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  table. However, 
44c0: 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
44d0: 64 79 0a 20 20 20 20 2a 2a 20 61 64 64 65 64 20  dy.    ** added 
44e0: 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68  a sample that sh
44f0: 61 72 65 73 20 74 68 69 73 20 70 72 65 66 69 78  ares this prefix
4500: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
4510: 65 64 20 74 6f 20 61 64 64 0a 20 20 20 20 2a 2a  ed to add.    **
4520: 20 74 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74 65   this one. Inste
4530: 61 64 2c 20 75 70 67 72 61 64 65 20 74 68 65 20  ad, upgrade the 
4540: 70 72 69 6f 72 69 74 79 20 6f 66 20 74 68 65 20  priority of the 
4550: 68 69 67 68 65 73 74 20 70 72 69 6f 72 69 74 79  highest priority
4560: 0a 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  .    ** existing
4570: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61   sample that sha
4580: 72 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2e  res this prefix.
4590: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70    */.    for(i=p
45a0: 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d  ->nSample-1; i>=
45b0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 53  0; i--){.      S
45c0: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64  tat4Sample *pOld
45d0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
45e0: 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e 45     if( pOld->anE
45f0: 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30  q[pNew->iCol]==0
4600: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4610: 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 20  pOld->isPSample 
4620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
4630: 20 20 61 73 73 65 72 74 28 20 73 61 6d 70 6c 65    assert( sample
4640: 49 73 42 65 74 74 65 72 28 70 4e 65 77 2c 20 70  IsBetter(pNew, p
4650: 4f 6c 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Old) );.        
4660: 69 66 28 20 70 55 70 67 72 61 64 65 3d 3d 30 20  if( pUpgrade==0 
4670: 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65  || sampleIsBette
4680: 72 28 70 4f 6c 64 2c 20 70 55 70 67 72 61 64 65  r(pOld, pUpgrade
4690: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
46a0: 55 70 67 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a  Upgrade = pOld;.
46b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
46c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
46d0: 70 55 70 67 72 61 64 65 20 29 7b 0a 20 20 20 20  pUpgrade ){.    
46e0: 20 20 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c    pUpgrade->iCol
46f0: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20   = pNew->iCol;. 
4700: 20 20 20 20 20 70 55 70 67 72 61 64 65 2d 3e 61       pUpgrade->a
4710: 6e 45 71 5b 70 55 70 67 72 61 64 65 2d 3e 69 43  nEq[pUpgrade->iC
4720: 6f 6c 5d 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71  ol] = pNew->anEq
4730: 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d  [pUpgrade->iCol]
4740: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  ;.      goto fin
4750: 64 5f 6e 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d  d_new_min;.    }
4760: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 65  .  }..  /* If ne
4770: 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76 65 20  cessary, remove 
4780: 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f 20 6d  sample iMin to m
4790: 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
47a0: 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a 2f 0a   new sample. */.
47b0: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
47c0: 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b  >=p->mxSample ){
47d0: 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65  .    Stat4Sample
47e0: 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b 70   *pMin = &p->a[p
47f0: 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52 6f  ->iMin];.    tRo
4800: 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d 69  wcnt *anEq = pMi
4810: 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52 6f  n->anEq;.    tRo
4820: 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d 69  wcnt *anLt = pMi
4830: 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74 52 6f  n->anLt;.    tRo
4840: 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70 4d  wcnt *anDLt = pM
4850: 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20 6d  in->anDLt;.    m
4860: 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d  emmove(pMin, &pM
4870: 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d  in[1], sizeof(p-
4880: 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70  >a[0])*(p->nSamp
4890: 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a  le-p->iMin-1));.
48a0: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
48b0: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  ->a[p->nSample-1
48c0: 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  ];.    pSample->
48d0: 61 6e 45 71 20 3d 20 61 6e 45 71 3b 0a 20 20 20  anEq = anEq;.   
48e0: 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 20   pSample->anDLt 
48f0: 3d 20 61 6e 44 4c 74 3b 0a 20 20 20 20 70 53 61  = anDLt;.    pSa
4900: 6d 70 6c 65 2d 3e 61 6e 4c 74 20 3d 20 61 6e 4c  mple->anLt = anL
4910: 74 3b 0a 20 20 20 20 70 2d 3e 6e 53 61 6d 70 6c  t;.    p->nSampl
4920: 65 20 3d 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 2d  e = p->mxSample-
4930: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  1;.  }..  /* Fig
4940: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 69 6e  ure out where in
4950: 20 74 68 65 20 61 5b 5d 20 61 72 72 61 79 20 74   the a[] array t
4960: 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 73 68  he new sample sh
4970: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
4980: 2e 20 2a 2f 0a 20 20 69 53 65 71 20 3d 20 70 4e  . */.  iSeq = pN
4990: 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c  ew->anLt[p->nCol
49a0: 2d 31 5d 3b 0a 20 20 66 6f 72 28 69 50 6f 73 3d  -1];.  for(iPos=
49b0: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 50 6f 73  p->nSample; iPos
49c0: 3e 30 3b 20 69 50 6f 73 2d 2d 29 7b 0a 20 20 20  >0; iPos--){.   
49d0: 20 69 66 28 20 69 53 65 71 3e 70 2d 3e 61 5b 69   if( iSeq>p->a[i
49e0: 50 6f 73 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e  Pos-1].anLt[p->n
49f0: 43 6f 6c 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a  Col-1] ) break;.
4a00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
4a10: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20   the new sample 
4a20: 2a 2f 0a 20 20 70 53 61 6d 70 6c 65 20 3d 20 26  */.  pSample = &
4a30: 70 2d 3e 61 5b 69 50 6f 73 5d 3b 0a 20 20 69 66  p->a[iPos];.  if
4a40: 28 20 69 50 6f 73 21 3d 70 2d 3e 6e 53 61 6d 70  ( iPos!=p->nSamp
4a50: 6c 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53  le ){.    Stat4S
4a60: 61 6d 70 6c 65 20 2a 70 45 6e 64 20 3d 20 26 70  ample *pEnd = &p
4a70: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b  ->a[p->nSample];
4a80: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
4a90: 45 71 20 3d 20 70 45 6e 64 2d 3e 61 6e 45 71 3b  Eq = pEnd->anEq;
4aa0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
4ab0: 4c 74 20 3d 20 70 45 6e 64 2d 3e 61 6e 4c 74 3b  Lt = pEnd->anLt;
4ac0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
4ad0: 44 4c 74 20 3d 20 70 45 6e 64 2d 3e 61 6e 44 4c  DLt = pEnd->anDL
4ae0: 74 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26  t;.    memmove(&
4af0: 70 2d 3e 61 5b 69 50 6f 73 5d 2c 20 26 70 2d 3e  p->a[iPos], &p->
4b00: 61 5b 69 50 6f 73 2b 31 5d 2c 20 28 70 2d 3e 6e  a[iPos+1], (p->n
4b10: 53 61 6d 70 6c 65 2d 69 50 6f 73 29 2a 73 69 7a  Sample-iPos)*siz
4b20: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 29 3b 0a 20  eof(p->a[0]));. 
4b30: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71     pSample->anEq
4b40: 20 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61   = anEq;.    pSa
4b50: 6d 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e  mple->anDLt = an
4b60: 44 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  DLt;.    pSample
4b70: 2d 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20  ->anLt = anLt;. 
4b80: 20 7d 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b   }.  p->nSample+
4b90: 2b 3b 0a 20 20 73 61 6d 70 6c 65 43 6f 70 79 28  +;.  sampleCopy(
4ba0: 70 2c 20 70 53 61 6d 70 6c 65 2c 20 70 4e 65 77  p, pSample, pNew
4bb0: 29 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  );..  /* Zero th
4bc0: 65 20 66 69 72 73 74 20 6e 45 71 5a 65 72 6f 20  e first nEqZero 
4bd0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61  entries in the a
4be0: 6e 45 71 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a  nEq[] array. */.
4bf0: 20 20 6d 65 6d 73 65 74 28 70 53 61 6d 70 6c 65    memset(pSample
4c00: 2d 3e 61 6e 45 71 2c 20 30 2c 20 73 69 7a 65 6f  ->anEq, 0, sizeo
4c10: 66 28 74 52 6f 77 63 6e 74 29 2a 6e 45 71 5a 65  f(tRowcnt)*nEqZe
4c20: 72 6f 29 3b 0a 0a 20 66 69 6e 64 5f 6e 65 77 5f  ro);.. find_new_
4c30: 6d 69 6e 3a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  min:.  if( p->nS
4c40: 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70  ample>=p->mxSamp
4c50: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  le ){.    int iM
4c60: 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  in = -1;.    for
4c70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d  (i=0; i<p->mxSam
4c80: 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
4c90: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50   if( p->a[i].isP
4ca0: 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75  Sample ) continu
4cb0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69  e;.      if( iMi
4cc0: 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42  n<0 || sampleIsB
4cd0: 65 74 74 65 72 28 26 70 2d 3e 61 5b 69 4d 69 6e  etter(&p->a[iMin
4ce0: 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a  ], &p->a[i]) ){.
4cf0: 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69          iMin = i
4d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4d10: 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e      assert( iMin
4d20: 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d  >=0 );.    p->iM
4d30: 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d  in = iMin;.  }.}
4d40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4d50: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
4d60: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
4d70: 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f 66  * Field iChng of
4d80: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
4d90: 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68 61   scanned has cha
4da0: 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69 73  nged. So at this
4db0: 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72   point.** p->cur
4dc0: 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  rent contains a 
4dd0: 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66 6c  sample that refl
4de0: 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f 75  ects the previou
4df0: 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20  s row of the.** 
4e00: 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75 65  index. The value
4e10: 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20   of anEq[iChng] 
4e20: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
4e30: 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61  nEq[] elements a
4e40: 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 74  re.** correct at
4e50: 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
4e60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
4e70: 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 53  lePushPrevious(S
4e80: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e  tat4Accum *p, in
4e90: 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65 66  t iChng){.#ifdef
4ea0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4eb0: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  TAT4.  int i;.. 
4ec0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79   /* Check if any
4ed0: 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68   samples from th
4ee0: 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79 20  e aBest[] array 
4ef0: 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65 64  should be pushed
4f00: 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78  .  ** into Index
4f10: 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68  Sample.a[] at th
4f20: 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  is point.  */.  
4f30: 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32  for(i=(p->nCol-2
4f40: 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d  ); i>=iChng; i--
4f50: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
4f60: 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e  le *pBest = &p->
4f70: 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 69 66  aBest[i];.    if
4f80: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
4f90: 6d 78 53 61 6d 70 6c 65 0a 20 20 20 20 20 7c 7c  mxSample.     ||
4fa0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
4fb0: 70 42 65 73 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e  pBest, &p->a[p->
4fc0: 69 4d 69 6e 5d 29 0a 20 20 20 20 29 7b 0a 20 20  iMin]).    ){.  
4fd0: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
4fe0: 28 70 2c 20 70 42 65 73 74 2c 20 69 29 3b 0a 20  (p, pBest, i);. 
4ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
5000: 70 64 61 74 65 20 74 68 65 20 61 6e 45 71 5b 5d  pdate the anEq[]
5010: 20 66 69 65 6c 64 73 20 6f 66 20 61 6e 79 20 73   fields of any s
5020: 61 6d 70 6c 65 73 20 61 6c 72 65 61 64 79 20 63  amples already c
5030: 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20 66  ollected. */.  f
5040: 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d  or(i=p->nSample-
5050: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5060: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f     int j;.    fo
5070: 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c 70 2d 3e  r(j=iChng; j<p->
5080: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
5090: 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 61 6e    if( p->a[i].an
50a0: 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d 3e 61 5b  Eq[j]==0 ) p->a[
50b0: 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20 70 2d 3e  i].anEq[j] = p->
50c0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 6a 5d 3b  current.anEq[j];
50d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
50e0: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
50f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
5100: 54 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  T3) && !defined(
5110: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
5120: 41 54 34 29 0a 20 20 69 66 28 20 69 43 68 6e 67  AT4).  if( iChng
5130: 3d 3d 30 20 29 7b 0a 20 20 20 20 74 52 6f 77 63  ==0 ){.    tRowc
5140: 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72 72  nt nLt = p->curr
5150: 65 6e 74 2e 61 6e 4c 74 5b 30 5d 3b 0a 20 20 20  ent.anLt[0];.   
5160: 20 74 52 6f 77 63 6e 74 20 6e 45 71 20 3d 20 70   tRowcnt nEq = p
5170: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 30  ->current.anEq[0
5180: 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ];..    /* Check
5190: 20 69 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   if this is to b
51a0: 65 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d  e a periodic sam
51b0: 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20  ple. If so, add 
51c0: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  it. */.    if( (
51d0: 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 29  nLt/p->nPSample)
51e0: 21 3d 28 6e 4c 74 2b 6e 45 71 29 2f 70 2d 3e 6e  !=(nLt+nEq)/p->n
51f0: 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  PSample ){.     
5200: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53   p->current.isPS
5210: 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  ample = 1;.     
5220: 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c   sampleInsert(p,
5230: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30 29   &p->current, 0)
5240: 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65  ;.      p->curre
5250: 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 30  nt.isPSample = 0
5260: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a 20 20  ;.    }else ..  
5270: 20 20 2f 2a 20 4f 72 20 69 66 20 69 74 20 69 73    /* Or if it is
5280: 20 61 20 6e 6f 6e 2d 70 65 72 69 6f 64 69 63 20   a non-periodic 
5290: 73 61 6d 70 6c 65 2e 20 41 64 64 20 69 74 20 69  sample. Add it i
52a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 6f 6f 2e  n this case too.
52b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   */.    if( p->n
52c0: 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70  Sample<p->mxSamp
52d0: 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65  le || sampleIsBe
52e0: 74 74 65 72 28 26 70 2d 3e 63 75 72 72 65 6e 74  tter(&p->current
52f0: 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d  , &p->a[p->iMin]
5300: 29 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c  ) ){.      sampl
5310: 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63  eInsert(p, &p->c
5320: 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  urrent, 0);.    
5330: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
5340: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5350: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
5360: 5f 70 75 73 68 20 53 51 4c 20 66 75 6e 63 74 69  _push SQL functi
5370: 6f 6e 3a 20 20 73 74 61 74 5f 70 75 73 68 28 50  on:  stat_push(P
5380: 2c 52 2c 43 29 0a 2a 2a 20 41 72 67 75 6d 65 6e  ,R,C).** Argumen
5390: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 20 20  ts:.**.**    P  
53a0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
53b0: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
53c0: 65 63 74 20 63 72 65 61 74 65 64 20 62 79 20 73  ect created by s
53d0: 74 61 74 5f 69 6e 69 74 28 29 0a 2a 2a 20 20 20  tat_init().**   
53e0: 20 43 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20   C     Index of 
53f0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
5400: 20 74 6f 20 64 69 66 66 65 72 20 66 72 6f 6d 20   to differ from 
5410: 70 72 65 76 69 6f 75 73 20 72 6f 77 0a 2a 2a 20  previous row.** 
5420: 20 20 20 52 20 20 20 20 20 52 6f 77 69 64 20 66     R     Rowid f
5430: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
5440: 6f 77 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  ow.**.** The SQL
5450: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
5460: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
5470: 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61 72 61 6d  *.** The R param
5480: 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 75 73 65  eter is only use
5490: 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20  d for STAT3 and 
54a0: 53 54 41 54 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  STAT4..*/.static
54b0: 20 76 6f 69 64 20 73 74 61 74 50 75 73 68 28 0a   void statPush(.
54c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
54d0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
54e0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
54f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5500: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
5510: 20 54 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   The three funct
5520: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
5530: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
5540: 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29   = (Stat4Accum*)
5550: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5560: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  ob(argv[0]);.  i
5570: 6e 74 20 69 43 68 6e 67 20 3d 20 73 71 6c 69 74  nt iChng = sqlit
5580: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
5590: 76 5b 31 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74  v[1]);..  assert
55a0: 28 20 70 2d 3e 6e 43 6f 6c 3e 31 20 29 3b 20 20  ( p->nCol>1 );  
55b0: 20 20 20 20 20 20 2f 2a 20 49 6e 63 6c 75 64 65        /* Include
55c0: 73 20 72 6f 77 69 64 20 66 69 65 6c 64 20 2a 2f  s rowid field */
55d0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 68 6e 67  .  assert( iChng
55e0: 3c 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69  <p->nCol );..  i
55f0: 66 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b  f( p->nRow==0 ){
5600: 0a 20 20 20 20 2f 2a 20 61 6e 45 71 5b 30 5d 20  .    /* anEq[0] 
5610: 69 73 20 6f 6e 6c 79 20 7a 65 72 6f 20 66 6f 72  is only zero for
5620: 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
5630: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
5640: 63 74 69 6f 6e 2e 20 20 44 6f 0a 20 20 20 20 2a  ction.  Do.    *
5650: 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
5660: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
5670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5680: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e  ->nCol; i++) p->
5690: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
56a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
56b0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20    /* Second and 
56c0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
56d0: 20 67 65 74 20 70 72 6f 63 65 73 73 65 64 20 68   get processed h
56e0: 65 72 65 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c  ere */.    sampl
56f0: 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c  ePushPrevious(p,
5700: 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a   iChng);..    /*
5710: 20 55 70 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c   Update anDLt[],
5720: 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71   anLt[] and anEq
5730: 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  [] to reflect th
5740: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 70  e values that ap
5750: 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ply.    ** to th
5760: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
5770: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   the index. */. 
5780: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43     for(i=0; i<iC
5790: 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  hng; i++){.     
57a0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71   p->current.anEq
57b0: 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]++;.    }.   
57c0: 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c   for(i=iChng; i<
57d0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
57e0: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
57f0: 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64  anDLt[i]++;.#ifd
5800: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5810: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
5820: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
5830: 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63  .anLt[i] += p->c
5840: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a  urrent.anEq[i];.
5850: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e  #endif.      p->
5860: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
5870: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
5880: 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64   p->nRow++;.#ifd
5890: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
58a0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
58b0: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 52 6f    p->current.iRo
58c0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
58d0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 32  lue_int64(argv[2
58e0: 5d 29 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74  ]);.  p->current
58f0: 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69 50 72 6e  .iHash = p->iPrn
5900: 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30 33 35   = p->iPrn*11035
5910: 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a 23  15245 + 12345;.#
5920: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5930: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
5940: 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f 77 63 6e  4.  {.    tRowcn
5950: 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72 72 65  t nLt = p->curre
5960: 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d  nt.anLt[p->nCol-
5970: 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  1];..    /* Chec
5980: 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 6f 20  k if this is to 
5990: 62 65 20 61 20 70 65 72 69 6f 64 69 63 20 73 61  be a periodic sa
59a0: 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64 64  mple. If so, add
59b0: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
59c0: 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  (nLt/p->nPSample
59d0: 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d 3e 6e 50  )!=(nLt+1)/p->nP
59e0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
59f0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61  p->current.isPSa
5a00: 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  mple = 1;.      
5a10: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
5a20: 3d 20 30 3b 0a 20 20 20 20 20 20 73 61 6d 70 6c  = 0;.      sampl
5a30: 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63  eInsert(p, &p->c
5a40: 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43 6f 6c 2d  urrent, p->nCol-
5a50: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  1);.      p->cur
5a60: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
5a70: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
5a80: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 42 65  * Update the aBe
5a90: 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  st[] array. */. 
5aa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70     for(i=0; i<(p
5ab0: 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29 7b  ->nCol-1); i++){
5ac0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
5ad0: 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20  t.iCol = i;.    
5ae0: 20 20 69 66 28 20 69 3e 3d 69 43 68 6e 67 20 7c    if( i>=iChng |
5af0: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
5b00: 28 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70  (&p->current, &p
5b10: 2d 3e 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20  ->aBest[i]) ){. 
5b20: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70         sampleCop
5b30: 79 28 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  y(p, &p->aBest[i
5b40: 5d 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b  ], &p->current);
5b50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5b60: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74   }.#endif.}.stat
5b70: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
5b80: 20 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66   statPushFuncdef
5b90: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33   = {.  2+IsStat3
5ba0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
5bb0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
5bc0: 2c 20 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e  ,     /* iPrefEn
5bd0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
5be0: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
5bf0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
5c00: 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44         /* pUserD
5c10: 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
5c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
5c30: 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75 73 68  xt */.  statPush
5c40: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6e  ,        /* xFun
5c50: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74 65 70          /* xStep
5c70: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
5c80: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c         /* xFinal
5c90: 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f 70  ize */.  "stat_p
5ca0: 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61  ush",     /* zNa
5cb0: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
5cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73           /* pHas
5cd0: 68 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  h */.  0        
5ce0: 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74          /* pDest
5cf0: 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 23 64  ructor */.};..#d
5d00: 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 53  efine STAT_GET_S
5d10: 54 41 54 31 20 30 20 20 20 20 20 20 20 20 20 20  TAT1 0          
5d20: 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e  /* "stat" column
5d30: 20 6f 66 20 73 74 61 74 31 20 74 61 62 6c 65 20   of stat1 table 
5d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
5d50: 47 45 54 5f 52 4f 57 49 44 20 31 20 20 20 20 20  GET_ROWID 1     
5d60: 20 20 20 20 20 2f 2a 20 22 72 6f 77 69 64 22 20       /* "rowid" 
5d70: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
5d80: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
5d90: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ine STAT_GET_NEQ
5da0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f 2a     2          /*
5db0: 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e 20 6f 66   "neq" column of
5dc0: 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20   stat[34] entry 
5dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
5de0: 47 45 54 5f 4e 4c 54 20 20 20 33 20 20 20 20 20  GET_NLT   3     
5df0: 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22 20 63 6f       /* "nlt" co
5e00: 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d  lumn of stat[34]
5e10: 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e   entry */.#defin
5e20: 65 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20  e STAT_GET_NDLT 
5e30: 20 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22   4          /* "
5e40: 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  ndlt" column of 
5e50: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
5e60: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5e70: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
5e80: 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 53 51 4c  tat_get(P,J) SQL
5e90: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5ea0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75   routine is.** u
5eb0: 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  sed to query the
5ec0: 20 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e 74 65   results.  Conte
5ed0: 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  nt is returned f
5ee0: 6f 72 20 70 61 72 61 6d 65 74 65 72 20 4a 0a 2a  or parameter J.*
5ef0: 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 65 20 6f  * which is one o
5f00: 66 20 74 68 65 20 53 54 41 54 5f 47 45 54 5f 78  f the STAT_GET_x
5f10: 78 78 78 20 76 61 6c 75 65 73 20 64 65 66 69 6e  xxx values defin
5f20: 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ed above..**.** 
5f30: 49 66 20 6e 65 69 74 68 65 72 20 53 54 41 54 33  If neither STAT3
5f40: 20 6e 6f 72 20 53 54 41 54 34 20 61 72 65 20 65   nor STAT4 are e
5f50: 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a 20 69  nabled, then J i
5f60: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54 41 54  s always.** STAT
5f70: 5f 47 45 54 5f 53 54 41 54 31 20 61 6e 64 20 69  _GET_STAT1 and i
5f80: 73 20 68 65 6e 63 65 20 6f 6d 69 74 74 65 64 20  s hence omitted 
5f90: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
5fa0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 6f 6e   becomes.** a on
5fb0: 65 2d 70 61 72 61 6d 65 74 65 72 20 66 75 6e 63  e-parameter func
5fc0: 74 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74 28 50  tion, stat_get(P
5fd0: 29 2c 20 74 68 61 74 20 61 6c 77 61 79 73 20 72  ), that always r
5fe0: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 73 74  eturns the.** st
5ff0: 61 74 31 20 74 61 62 6c 65 20 65 6e 74 72 79 20  at1 table entry 
6000: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
6010: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
6020: 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Get(.  sqlite3_c
6030: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6040: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6050: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6060: 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63  rgv.){.  Stat4Ac
6070: 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41  cum *p = (Stat4A
6080: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61  ccum*)sqlite3_va
6090: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
60a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
60b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
60c0: 5f 53 54 41 54 34 0a 20 20 2f 2a 20 53 54 41 54  _STAT4.  /* STAT
60d0: 33 20 61 6e 64 20 53 54 41 54 34 20 68 61 76 65  3 and STAT4 have
60e0: 20 61 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 20   a parameter on 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
6100: 0a 20 20 69 6e 74 20 65 43 61 6c 6c 20 3d 20 73  .  int eCall = s
6110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6120: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
6130: 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a  ert( argc==2 );.
6140: 20 20 61 73 73 65 72 74 28 20 65 43 61 6c 6c 3d    assert( eCall=
6150: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
6160: 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47  || eCall==STAT_G
6170: 45 54 5f 4e 45 51 20 0a 20 20 20 20 20 20 20 7c  ET_NEQ .       |
6180: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
6190: 54 5f 52 4f 57 49 44 20 7c 7c 20 65 43 61 6c 6c  T_ROWID || eCall
61a0: 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 4c 54 0a 20  ==STAT_GET_NLT. 
61b0: 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d        || eCall==
61c0: 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20 0a 20  STAT_GET_NDLT . 
61d0: 20 29 3b 0a 20 20 69 66 28 20 65 43 61 6c 6c 3d   );.  if( eCall=
61e0: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
61f0: 29 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74  ).#else.  assert
6200: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 23 65 6e  ( argc==1 );.#en
6210: 64 69 66 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 52  dif.  {.    /* R
6220: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
6230: 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  to store in the 
6240: 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66  "stat" column of
6250: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
6260: 31 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 66  1.    ** table f
6270: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  or this index.. 
6280: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6290: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
62a0: 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61  ng composed of a
62b0: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72   list of integer
62c0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 0a 20 20  s describing .  
62d0: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20    ** the index. 
62e0: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
62f0: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  r in the list is
6300: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
6310: 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20 65 6e 74  r of .    ** ent
6320: 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ries in the inde
6330: 78 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  x. There is one 
6340: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
6350: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 0a  er in the list .
6360: 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
6370: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
6380: 54 68 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  This additional 
6390: 69 6e 74 65 67 65 72 20 69 73 20 61 6e 20 65 73  integer is an es
63a0: 74 69 6d 61 74 65 20 6f 66 0a 20 20 20 20 2a 2a  timate of.    **
63b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
63c0: 6f 77 73 20 6d 61 74 63 68 65 64 20 62 79 20 61  ows matched by a
63d0: 20 73 74 61 62 62 69 6e 67 20 71 75 65 72 79 20   stabbing query 
63e0: 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  on the index usi
63f0: 6e 67 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20  ng.    ** a key 
6400: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
6410: 6f 6e 64 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66  onding number of
6420: 20 66 69 65 6c 64 73 2e 20 49 6e 20 6f 74 68 65   fields. In othe
6430: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 2a 2a 20  r words,.    ** 
6440: 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
6450: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28 61 2c 62 29  on columns (a,b)
6460: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
6470: 73 74 61 74 31 20 76 61 6c 75 65 20 69 73 20 0a  stat1 value is .
6480: 20 20 20 20 2a 2a 20 22 31 30 30 20 31 30 20 32      ** "100 10 2
6490: 22 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 65  ", then SQLite e
64a0: 73 74 69 6d 61 74 65 73 20 74 68 61 74 3a 0a 20  stimates that:. 
64b0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 2a     **.    **   *
64c0: 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   the index conta
64d0: 69 6e 73 20 31 30 30 20 72 6f 77 73 2c 0a 20 20  ins 100 rows,.  
64e0: 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20    **   * "WHERE 
64f0: 61 3d 3f 22 20 6d 61 74 63 68 65 73 20 31 30 20  a=?" matches 10 
6500: 72 6f 77 73 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  rows, and.    **
6510: 20 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 20     * "WHERE a=? 
6520: 41 4e 44 20 62 3d 3f 22 20 6d 61 74 63 68 65 73  AND b=?" matches
6530: 20 32 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 0a   2 rows..    **.
6540: 20 20 20 20 2a 2a 20 49 66 20 44 20 69 73 20 74      ** If D is t
6550: 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74  he count of dist
6560: 69 6e 63 74 20 76 61 6c 75 65 73 20 61 6e 64 20  inct values and 
6570: 4b 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  K is the total n
6580: 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a  umber of .    **
6590: 20 72 6f 77 73 2c 20 74 68 65 6e 20 65 61 63 68   rows, then each
65a0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6d   estimate is com
65b0: 70 75 74 65 64 20 61 73 3a 0a 20 20 20 20 2a 2a  puted as:.    **
65c0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 49  .    **        I
65d0: 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20 20   = (K+D-1)/D.   
65e0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b   */.    char *z;
65f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
6600: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
6610: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
6620: 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20  p->nCol * 25);. 
6630: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
6640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6650: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
6660: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
6670: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6680: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
6690: 70 72 69 6e 74 66 28 32 34 2c 20 7a 52 65 74 2c  printf(24, zRet,
66a0: 20 22 25 6c 6c 64 22 2c 20 70 2d 3e 6e 52 6f 77   "%lld", p->nRow
66b0: 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52 65 74 20  );.    z = zRet 
66c0: 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
66d0: 30 28 7a 52 65 74 29 3b 0a 20 20 20 20 66 6f 72  0(zRet);.    for
66e0: 28 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c  (i=0; i<(p->nCol
66f0: 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -1); i++){.     
6700: 20 69 36 34 20 6e 44 69 73 74 69 6e 63 74 20 3d   i64 nDistinct =
6710: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c   p->current.anDL
6720: 74 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20 20 20  t[i] + 1;.      
6730: 69 36 34 20 69 56 61 6c 20 3d 20 28 70 2d 3e 6e  i64 iVal = (p->n
6740: 52 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63 74 20  Row + nDistinct 
6750: 2d 20 31 29 20 2f 20 6e 44 69 73 74 69 6e 63 74  - 1) / nDistinct
6760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6770: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20  snprintf(24, z, 
6780: 22 20 25 6c 6c 64 22 2c 20 69 56 61 6c 29 3b 0a  " %lld", iVal);.
6790: 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
67a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
67b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
67c0: 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20  current.anEq[i] 
67d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
67e0: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20  ert( z[0]=='\0' 
67f0: 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a 20 20  && z>zRet );..  
6800: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6810: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
6820: 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Ret, -1, sqlite3
6830: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69 66 64  _free);.  }.#ifd
6840: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6850: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
6860: 20 20 65 6c 73 65 20 69 66 28 20 65 43 61 6c 6c    else if( eCall
6870: 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44  ==STAT_GET_ROWID
6880: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
6890: 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  Get<0 ){.      s
68a0: 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75  amplePushPreviou
68b0: 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  s(p, 0);.      p
68c0: 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20 20 20  ->iGet = 0;.    
68d0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47 65  }.    if( p->iGe
68e0: 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  t<p->nSample ){.
68f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6900: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6910: 78 74 2c 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74  xt, p->a[p->iGet
6920: 5d 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  ].iRowid);.    }
6930: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
6940: 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b  owcnt *aCnt = 0;
6950: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
6960: 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65  >iGet<p->nSample
6970: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
6980: 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  eCall ){.      c
6990: 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ase STAT_GET_NEQ
69a0: 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70  :  aCnt = p->a[p
69b0: 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20 62 72  ->iGet].anEq; br
69c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
69d0: 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20 20 61  STAT_GET_NLT:  a
69e0: 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47  Cnt = p->a[p->iG
69f0: 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b  et].anLt; break;
6a00: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6a10: 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74 20 3d  {.        aCnt =
6a20: 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61   p->a[p->iGet].a
6a30: 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20 20 70  nDLt; .        p
6a40: 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20 20 20  ->iGet++;.      
6a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6a60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
6a70: 49 73 53 74 61 74 33 20 29 7b 0a 20 20 20 20 20  IsStat3 ){.     
6a80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6a90: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  int64(context, (
6aa0: 69 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a 20 20  i64)aCnt[0]);.  
6ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6ac0: 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69  har *zRet = sqli
6ad0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d  te3MallocZero(p-
6ae0: 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20 20 20  >nCol * 25);.   
6af0: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
6b00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6b10: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
6b20: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
6b30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6b40: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
6b50: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65     char *z = zRe
6b60: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
6b70: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
6b80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
6b90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6ba0: 32 34 2c 20 7a 2c 20 22 25 6c 6c 64 20 22 2c 20  24, z, "%lld ", 
6bb0: 61 43 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aCnt[i]);.      
6bc0: 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
6bd0: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
6be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
6bf0: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30  ssert( z[0]=='\0
6c00: 27 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 20  ' && z>zRet );. 
6c10: 20 20 20 20 20 20 20 7a 5b 2d 31 5d 20 3d 20 27         z[-1] = '
6c20: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \0';.        sql
6c30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6c40: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20  (context, zRet, 
6c50: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
6c60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6c70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
6c80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
6c90: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 7d  T3_OR_STAT4 */.}
6ca0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75  .static const Fu
6cb0: 6e 63 44 65 66 20 73 74 61 74 47 65 74 46 75 6e  ncDef statGetFun
6cc0: 63 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49 73 53  cdef = {.  1+IsS
6cd0: 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e  tat34,      /* n
6ce0: 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  Arg */.  SQLITE_
6cf0: 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 69 50 72  UTF8,     /* iPr
6d00: 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  efEnc */.  0,   
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
6d20: 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20  lags */.  0,    
6d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55             /* pU
6d40: 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20  serData */.  0, 
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d60: 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74   pNext */.  stat
6d70: 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Get,         /* 
6d80: 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xFunc */.  0,   
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6da0: 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Step */.  0,    
6db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
6dc0: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
6dd0: 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f 2a  at_get",      /*
6de0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20   zName */.  0,  
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e00: 70 48 61 73 68 20 2a 2f 0a 20 20 30 20 20 20 20  pHash */.  0    
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
6e20: 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b  Destructor */.};
6e30: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
6e40: 6c 6c 53 74 61 74 47 65 74 28 56 64 62 65 20 2a  llStatGet(Vdbe *
6e50: 76 2c 20 69 6e 74 20 72 65 67 53 74 61 74 34 2c  v, int regStat4,
6e60: 20 69 6e 74 20 69 50 61 72 61 6d 2c 20 69 6e 74   int iParam, int
6e70: 20 72 65 67 4f 75 74 29 7b 0a 20 20 61 73 73 65   regOut){.  asse
6e80: 72 74 28 20 72 65 67 4f 75 74 21 3d 72 65 67 53  rt( regOut!=regS
6e90: 74 61 74 34 20 26 26 20 72 65 67 4f 75 74 21 3d  tat4 && regOut!=
6ea0: 72 65 67 53 74 61 74 34 2b 31 20 29 3b 0a 23 69  regStat4+1 );.#i
6eb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6ec0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
6ed0: 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  4.  sqlite3VdbeA
6ee0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6ef0: 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72 65 67  ger, iParam, reg
6f00: 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 73 65 0a  Stat4+1);.#else.
6f10: 20 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d    assert( iParam
6f20: 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31  ==STAT_GET_STAT1
6f30: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c   );.#endif.  sql
6f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6f50: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 30  , OP_Function, 0
6f60: 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 4f  , regStat4, regO
6f70: 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ut);.  sqlite3Vd
6f80: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6f90: 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 47 65  , (char*)&statGe
6fa0: 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e  tFuncdef, P4_FUN
6fb0: 43 44 45 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  CDEF);.  sqlite3
6fc0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6fd0: 31 20 2b 20 49 73 53 74 61 74 33 34 29 3b 0a 7d  1 + IsStat34);.}
6fe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6ff0: 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 6e 20 61   code to do an a
7000: 6e 61 6c 79 73 69 73 20 6f 66 20 61 6c 6c 20 69  nalysis of all i
7010: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
7020: 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
7030: 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  le table..*/.sta
7040: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
7050: 4f 6e 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  OneTable(.  Pars
7060: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
7070: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7080: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
7090: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 68       /* Table wh
70a0: 6f 73 65 20 69 6e 64 69 63 65 73 20 61 72 65 20  ose indices are 
70b0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
70c0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79  /.  Index *pOnly
70d0: 49 64 78 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  Idx, /* If not N
70e0: 55 4c 4c 2c 20 6f 6e 6c 79 20 61 6e 61 6c 79 7a  ULL, only analyz
70f0: 65 20 74 68 69 73 20 6f 6e 65 20 69 6e 64 65 78  e this one index
7100: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 43   */.  int iStatC
7110: 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ur,    /* Index 
7120: 6f 66 20 56 64 62 65 43 75 72 73 6f 72 20 74 68  of VdbeCursor th
7130: 61 74 20 77 72 69 74 65 73 20 74 68 65 20 73 71  at writes the sq
7140: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
7150: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 2c 20   */.  int iMem, 
7160: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
7170: 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ble memory locat
7180: 69 6f 6e 73 20 62 65 67 69 6e 20 68 65 72 65 20  ions begin here 
7190: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 20 20  */.  int iTab   
71a0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
71b0: 61 69 6c 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  ailable cursor *
71c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
71d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
71e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
71f0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 64 65  handle */.  Inde
7200: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
7210: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
7220: 6e 64 65 78 20 74 6f 20 62 65 69 6e 67 20 61 6e  ndex to being an
7230: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
7240: 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
7250: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
7260: 6f 72 20 6f 70 65 6e 20 6f 6e 20 69 6e 64 65 78  or open on index
7270: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
7280: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
7290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72a0: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
72b0: 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  r */.  Vdbe *v; 
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
72e0: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
72f0: 20 62 75 69 6c 74 20 75 70 20 2a 2f 0a 20 20 69   built up */.  i
7300: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7320: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7330: 20 69 6e 74 20 6a 5a 65 72 6f 52 6f 77 73 20 3d   int jZeroRows =
7340: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   -1;          /*
7350: 20 4a 75 6d 70 20 66 72 6f 6d 20 68 65 72 65 20   Jump from here 
7360: 69 66 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  if number of row
7370: 73 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 69  s is zero */.  i
7380: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
7390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
73a0: 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
73b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
73c0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 54 61 62   */.  u8 needTab
73d0: 6c 65 43 6e 74 20 3d 20 31 3b 20 20 20 20 20 20  leCnt = 1;      
73e0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f     /* True to co
73f0: 75 6e 74 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  unt the table */
7400: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 52 6f 77  .  int regNewRow
7410: 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  id = iMem++;    
7420: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65  /* Rowid for the
7430: 20 69 6e 73 65 72 74 65 64 20 72 65 63 6f 72 64   inserted record
7440: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61   */.  int regSta
7450: 74 34 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  t4 = iMem++;    
7460: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
7470: 6f 20 68 6f 6c 64 20 53 74 61 74 34 41 63 63 75  o hold Stat4Accu
7480: 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  m object */.  in
7490: 74 20 72 65 67 43 68 6e 67 20 3d 20 69 4d 65 6d  t regChng = iMem
74a0: 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ++;        /* In
74b0: 64 65 78 20 6f 66 20 63 68 61 6e 67 65 64 20 69  dex of changed i
74c0: 6e 64 65 78 20 66 69 65 6c 64 20 2a 2f 0a 23 69  ndex field */.#i
74d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
74e0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
74f0: 34 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  4.  int regRowid
7500: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
7510: 20 2f 2a 20 52 6f 77 69 64 20 61 72 67 75 6d 65   /* Rowid argume
7520: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 73 74 61  nt passed to sta
7530: 74 5f 70 75 73 68 28 29 20 2a 2f 0a 23 65 6e 64  t_push() */.#end
7540: 69 66 0a 20 20 69 6e 74 20 72 65 67 54 65 6d 70  if.  int regTemp
7550: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
7560: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
7570: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
7580: 20 69 6e 74 20 72 65 67 54 61 62 6e 61 6d 65 20   int regTabname 
7590: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a  = iMem++;     /*
75a0: 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   Register contai
75b0: 6e 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 20  ning table name 
75c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78 6e  */.  int regIdxn
75d0: 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  ame = iMem++;   
75e0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
75f0: 6e 74 61 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e  ntaining index n
7600: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ame */.  int reg
7610: 53 74 61 74 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20  Stat1 = iMem++; 
7620: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
7630: 6f 72 20 74 68 65 20 73 74 61 74 20 63 6f 6c 75  or the stat colu
7640: 6d 6e 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  mn of sqlite_sta
7650: 74 31 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  t1 */.  int regP
7660: 72 65 76 20 3d 20 69 4d 65 6d 3b 20 20 20 20 20  rev = iMem;     
7670: 20 20 20 20 20 2f 2a 20 4d 55 53 54 20 42 45 20       /* MUST BE 
7680: 4c 41 53 54 20 28 73 65 65 20 62 65 6c 6f 77 29  LAST (see below)
7690: 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e   */..  pParse->n
76a0: 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65  Mem = MAX(pParse
76b0: 2d 3e 6e 4d 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20  ->nMem, iMem);. 
76c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
76d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
76e0: 66 28 20 76 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( v==0 || NEVER
76f0: 28 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20 20 20  (pTab==0) ){.   
7700: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7710: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30  f( pTab->tnum==0
7720: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
7730: 74 20 67 61 74 68 65 72 20 73 74 61 74 69 73 74  t gather statist
7740: 69 63 73 20 6f 6e 20 76 69 65 77 73 20 6f 72 20  ics on views or 
7750: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
7760: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
7770: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
7780: 73 74 72 6e 69 63 6d 70 28 70 54 61 62 2d 3e 7a  strnicmp(pTab->z
7790: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
77a0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   7)==0 ){.    /*
77b0: 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73   Do not gather s
77c0: 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79 73  tatistics on sys
77d0: 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  tem tables */.  
77e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
77f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
7800: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
7810: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44 62  xes(db) );.  iDb
7820: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7830: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
7840: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
7850: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a  sert( iDb>=0 );.
7860: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7870: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
7880: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
7890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
78a0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
78b0: 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
78c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
78d0: 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c   SQLITE_ANALYZE,
78e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
78f0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
7900: 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
7910: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
7920: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61  endif..  /* Esta
7930: 62 6c 69 73 68 20 61 20 72 65 61 64 2d 6c 6f 63  blish a read-loc
7940: 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 61  k on the table a
7950: 74 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  t the shared-cac
7960: 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a 20  he level. .  ** 
7970: 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
7980: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 74   cursor on the t
7990: 61 62 6c 65 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63  able. Also alloc
79a0: 61 74 65 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  ate a cursor num
79b0: 62 65 72 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ber.  ** to use 
79c0: 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 69 6e 64  for scanning ind
79d0: 65 78 65 73 20 28 69 49 64 78 43 75 72 29 2e 20  exes (iIdxCur). 
79e0: 4e 6f 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  No index cursor 
79f0: 69 73 20 6f 70 65 6e 65 64 20 61 74 0a 20 20 2a  is opened at.  *
7a00: 2a 20 74 68 69 73 20 74 69 6d 65 20 74 68 6f 75  * this time thou
7a10: 67 68 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gh.  */.  sqlite
7a20: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
7a30: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
7a40: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
7a50: 6d 65 29 3b 0a 20 20 69 54 61 62 43 75 72 20 3d  me);.  iTabCur =
7a60: 20 69 54 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43   iTab++;.  iIdxC
7a70: 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 70  ur = iTab++;.  p
7a80: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 4d 41  Parse->nTab = MA
7a90: 58 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20  X(pParse->nTab, 
7aa0: 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTab);.  sqlite3
7ab0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
7ac0: 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20  , iTabCur, iDb, 
7ad0: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
7ae0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
7af0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
7b00: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54 61 62  ring8, 0, regTab
7b10: 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  name, 0, pTab->z
7b20: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 66 6f 72  Name, 0);..  for
7b30: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
7b40: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
7b50: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
7b60: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
7b90: 6d 6e 73 20 69 6e 64 65 78 65 64 20 62 79 20 70  mns indexed by p
7ba0: 49 64 78 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  Idx */.    KeyIn
7bb0: 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
7bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
7bd0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
7be0: 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e  r pIdx */.    in
7bf0: 74 20 2a 61 47 6f 74 6f 43 68 6e 67 3b 20 20 20  t *aGotoChng;   
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7c10: 72 72 61 79 20 6f 66 20 6a 75 6d 70 20 69 6e 73  rray of jump ins
7c20: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
7c30: 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  es */.    int ad
7c40: 64 72 52 65 77 69 6e 64 3b 20 20 20 20 20 20 20  drRewind;       
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
7c60: 73 73 20 6f 66 20 22 4f 50 5f 52 65 77 69 6e 64  ss of "OP_Rewind
7c70: 20 69 49 64 78 43 75 72 22 20 2a 2f 0a 20 20 20   iIdxCur" */.   
7c80: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 43 68 6e   int addrGotoChn
7c90: 67 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  g0;            /
7ca0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22 47 6f  * Address of "Go
7cb0: 74 6f 20 61 64 64 72 5f 63 68 6e 67 5f 30 22 20  to addr_chng_0" 
7cc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  */.    int addrN
7cd0: 65 78 74 52 6f 77 3b 20 20 20 20 20 20 20 20 20  extRow;         
7ce0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7cf0: 6f 66 20 22 6e 65 78 74 5f 72 6f 77 3a 22 20 2a  of "next_row:" *
7d00: 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f 6e 6c 79  /..    if( pOnly
7d10: 49 64 78 20 26 26 20 70 4f 6e 6c 79 49 64 78 21  Idx && pOnlyIdx!
7d20: 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65  =pIdx ) continue
7d30: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
7d40: 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
7d50: 20 29 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20   ) needTableCnt 
7d60: 3d 20 30 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  = 0;.    VdbeNoo
7d70: 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
7d80: 67 69 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20  gin analysis of 
7d90: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
7da0: 29 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  ));.    nCol = p
7db0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
7dc0: 20 20 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71    aGotoChng = sq
7dd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7de0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
7df0: 2a 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  *(nCol+1));.    
7e00: 69 66 28 20 61 47 6f 74 6f 43 68 6e 67 3d 3d 30  if( aGotoChng==0
7e10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7e20: 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49   pKey = sqlite3I
7e30: 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
7e40: 73 65 2c 20 70 49 64 78 29 3b 0a 0a 20 20 20 20  se, pIdx);..    
7e50: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
7e60: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
7e70: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ing the index na
7e80: 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
7e90: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
7ea0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
7eb0: 65 67 49 64 78 6e 61 6d 65 2c 20 30 2c 20 70 49  egIdxname, 0, pI
7ec0: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a  dx->zName, 0);..
7ed0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 73      /*.    ** Ps
7ee0: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 6c 6f  eudo-code for lo
7ef0: 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20 73 74  op that calls st
7f00: 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20 20 2a  at_push():.    *
7f10: 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e  *.    **   Rewin
7f20: 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69  d csr.    **   i
7f30: 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20  f eof(csr) goto 
7f40: 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20  end_of_scan;.   
7f50: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
7f60: 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20  0.    **   goto 
7f70: 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20 20 20  chng_addr_0;.   
7f80: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78 74   **.    **  next
7f90: 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20 72  _row:.    **   r
7fa0: 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a  egChng = 0.    *
7fb0: 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20 21  *   if( idx(0) !
7fc0: 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20 67  = regPrev(0) ) g
7fd0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 0a  oto chng_addr_0.
7fe0: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
7ff0: 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 1.    **   if
8000: 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67 50  ( idx(1) != regP
8010: 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68  rev(1) ) goto ch
8020: 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a 2a  ng_addr_1.    **
8030: 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20     ....    **   
8040: 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20 20  regChng = N.    
8050: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
8060: 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  ddr_N.    **.   
8070: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 30   **  chng_addr_0
8080: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72  :.    **   regPr
8090: 65 76 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20  ev(0) = idx(0). 
80a0: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
80b0: 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _1:.    **   reg
80c0: 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31 29  Prev(1) = idx(1)
80d0: 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20  .    **  ....   
80e0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67   **.    **  chng
80f0: 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20  _addr_N:.    ** 
8100: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78    regRowid = idx
8110: 28 72 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20  (rowid).    **  
8120: 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65   stat_push(P, re
8130: 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29  gChng, regRowid)
8140: 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63  .    **   Next c
8150: 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21  sr.    **   if !
8160: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65  eof(csr) goto ne
8170: 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a 0a 20  xt_row;.    **. 
8180: 20 20 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f 73 63     **  end_of_sc
8190: 61 6e 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20  an:.    */..    
81a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
81b0: 72 65 20 61 72 65 20 65 6e 6f 75 67 68 20 6d 65  re are enough me
81c0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6c 6c 6f 63  mory cells alloc
81d0: 61 74 65 64 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ated to accommod
81e0: 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
81f0: 72 65 67 50 72 65 76 20 61 72 72 61 79 20 61 6e  regPrev array an
8200: 64 20 61 20 74 72 61 69 6c 69 6e 67 20 72 6f 77  d a trailing row
8210: 69 64 20 28 74 68 65 20 72 6f 77 69 64 20 73 6c  id (the rowid sl
8220: 6f 74 20 69 73 20 72 65 71 75 69 72 65 64 0a 20  ot is required. 
8230: 20 20 20 2a 2a 20 77 68 65 6e 20 62 75 69 6c 64     ** when build
8240: 69 6e 67 20 61 20 72 65 63 6f 72 64 20 74 6f 20  ing a record to 
8250: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
8260: 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  sample column of
8270: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c   .    ** the sql
8280: 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e  ite_stat4 table.
8290: 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
82a0: 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72  >nMem = MAX(pPar
82b0: 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50 72 65  se->nMem, regPre
82c0: 76 2b 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v+nCol);..    /*
82d0: 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
82e0: 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  y cursor on the 
82f0: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
8300: 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73  yzed. */.    ass
8310: 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74 65  ert( iDb==sqlite
8320: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
8330: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
8340: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
8350: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8360: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
8370: 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ur, pIdx->tnum, 
8380: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
8390: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
83a0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 65 79   -1, (char*)pKey
83b0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
83c0: 44 4f 46 46 29 3b 20 0a 20 20 20 20 56 64 62 65  DOFF); .    Vdbe
83d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
83e0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
83f0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
8400: 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28 29 20  the stat_init() 
8410: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 61 72  function. The ar
8420: 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20 20 20  guments are:.   
8430: 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 20 28   ** .    **    (
8440: 31 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  1) the number of
8450: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8460: 69 6e 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20  index including 
8470: 74 68 65 20 72 6f 77 69 64 2c 0a 20 20 20 20 2a  the rowid,.    *
8480: 2a 20 20 20 20 28 32 29 20 74 68 65 20 6e 75 6d  *    (2) the num
8490: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
84a0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
84b0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
84c0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  nd argument is o
84d0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41  nly used for STA
84e0: 54 33 20 61 6e 64 20 53 54 41 54 34 0a 20 20 20  T3 and STAT4.   
84f0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
8500: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
8510: 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
8520: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8530: 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43   OP_Count, iIdxC
8540: 75 72 2c 20 72 65 67 53 74 61 74 34 2b 32 29 3b  ur, regStat4+2);
8550: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
8560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8570: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
8580: 6c 2b 31 2c 20 72 65 67 53 74 61 74 34 2b 31 29  l+1, regStat4+1)
8590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
85a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75  eAddOp3(v, OP_Fu
85b0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 72 65 67 53 74  nction, 0, regSt
85c0: 61 74 34 2b 31 2c 20 72 65 67 53 74 61 74 34 29  at4+1, regStat4)
85d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
85e0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
85f0: 20 28 63 68 61 72 2a 29 26 73 74 61 74 49 6e 69   (char*)&statIni
8600: 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e  tFuncdef, P4_FUN
8610: 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
8620: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
8630: 2c 20 31 2b 49 73 53 74 61 74 33 34 29 3b 0a 0a  , 1+IsStat34);..
8640: 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
8650: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  ation of the fol
8660: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  lowing:.    **. 
8670: 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64 20 63     **   Rewind c
8680: 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 65  sr.    **   if e
8690: 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 65 6e 64  of(csr) goto end
86a0: 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20 20 2a 2a  _of_scan;.    **
86b0: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20     regChng = 0. 
86c0: 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 6e 65 78     **   goto nex
86d0: 74 5f 70 75 73 68 5f 30 3b 0a 20 20 20 20 2a 2a  t_push_0;.    **
86e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72  .    */.    addr
86f0: 52 65 77 69 6e 64 20 3d 20 73 71 6c 69 74 65 33  Rewind = sqlite3
8700: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8710: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
8720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8730: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8740: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68  nteger, 0, regCh
8750: 6e 67 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 74  ng);.    addrGot
8760: 6f 43 68 6e 67 30 20 3d 20 73 71 6c 69 74 65 33  oChng0 = sqlite3
8770: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8780: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20 20 2f 2a 0a  _Goto);..    /*.
8790: 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77      **  next_row
87a0: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68  :.    **   regCh
87b0: 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20  ng = 0.    **   
87c0: 69 66 28 20 69 64 78 28 30 29 20 21 3d 20 72 65  if( idx(0) != re
87d0: 67 50 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20  gPrev(0) ) goto 
87e0: 63 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20  chng_addr_0.    
87f0: 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31  **   regChng = 1
8800: 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64  .    **   if( id
8810: 78 28 31 29 20 21 3d 20 72 65 67 50 72 65 76 28  x(1) != regPrev(
8820: 31 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61  1) ) goto chng_a
8830: 64 64 72 5f 31 0a 20 20 20 20 2a 2a 20 20 20 2e  ddr_1.    **   .
8840: 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43  ...    **   regC
8850: 68 6e 67 20 3d 20 4e 0a 20 20 20 20 2a 2a 20 20  hng = N.    **  
8860: 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f   goto chng_addr_
8870: 4e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64  N.    */.    add
8880: 72 4e 65 78 74 52 6f 77 20 3d 20 73 71 6c 69 74  rNextRow = sqlit
8890: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
88a0: 72 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  r(v);.    for(i=
88b0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
88c0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 43 6f  .      char *pCo
88d0: 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ll = (char*)sqli
88e0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
88f0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
8900: 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  zColl[i]);.     
8910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8920: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8930: 2c 20 69 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20  , i, regChng);. 
8940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8950: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
8960: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
8970: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
8980: 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d 20   aGotoChng[i] = 
8990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
89a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
89b0: 65 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 72  e, regTemp, 0, r
89c0: 65 67 50 72 65 76 2b 69 2c 20 70 43 6f 6c 6c 2c  egPrev+i, pColl,
89d0: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
89e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
89f0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
8a00: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 7d  E_NULLEQ);.    }
8a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8a20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8a30: 65 67 65 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 43  eger, nCol, regC
8a40: 68 6e 67 29 3b 0a 20 20 20 20 61 47 6f 74 6f 43  hng);.    aGotoC
8a50: 68 6e 67 5b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  hng[nCol] = sqli
8a60: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8a70: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20 20   OP_Goto);..    
8a80: 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  /*.    **  chng_
8a90: 61 64 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20 20  addr_0:.    **  
8aa0: 20 72 65 67 50 72 65 76 28 30 29 20 3d 20 69 64   regPrev(0) = id
8ab0: 78 28 30 29 0a 20 20 20 20 2a 2a 20 20 63 68 6e  x(0).    **  chn
8ac0: 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a 2a  g_addr_1:.    **
8ad0: 20 20 20 72 65 67 50 72 65 76 28 31 29 20 3d 20     regPrev(1) = 
8ae0: 69 64 78 28 31 29 0a 20 20 20 20 2a 2a 20 20 2e  idx(1).    **  .
8af0: 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ...    */.    sq
8b00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8b10: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 43 68 6e  e(v, addrGotoChn
8b20: 67 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  g0);.    for(i=0
8b30: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
8b40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 47 6f  eJumpHere(v, aGo
8b60: 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  toChng[i]);.    
8b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8b80: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8b90: 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72 65  , iIdxCur, i, re
8ba0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 7d 0a  gPrev+i);.    }.
8bb0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
8bc0: 63 68 6e 67 5f 61 64 64 72 5f 4e 3a 0a 20 20 20  chng_addr_N:.   
8bd0: 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d   **   regRowid =
8be0: 20 69 64 78 28 72 6f 77 69 64 29 20 20 20 20 20   idx(rowid)     
8bf0: 20 20 20 20 20 20 20 2f 2f 20 53 54 41 54 33 34         // STAT34
8c00: 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 73   only.    **   s
8c10: 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65 67 43  tat_push(P, regC
8c20: 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29 20 20  hng, regRowid)  
8c30: 2f 2f 20 33 72 64 20 70 61 72 61 6d 65 74 65 72  // 3rd parameter
8c40: 20 53 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20   STAT34 only.   
8c50: 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72 0a 20   **   Next csr. 
8c60: 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f 66 28     **   if !eof(
8c70: 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72  csr) goto next_r
8c80: 6f 77 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ow;.    */.    s
8c90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
8ca0: 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b  re(v, aGotoChng[
8cb0: 6e 43 6f 6c 5d 29 3b 0a 23 69 66 64 65 66 20 53  nCol]);.#ifdef S
8cc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8cd0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
8ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8cf0: 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
8d00: 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 52 6f  , iIdxCur, regRo
8d10: 77 69 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wid);.    assert
8d20: 28 20 72 65 67 52 6f 77 69 64 3d 3d 28 72 65 67  ( regRowid==(reg
8d30: 53 74 61 74 34 2b 32 29 20 29 3b 0a 23 65 6e 64  Stat4+2) );.#end
8d40: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  if.    assert( r
8d50: 65 67 43 68 6e 67 3d 3d 28 72 65 67 53 74 61 74  egChng==(regStat
8d60: 34 2b 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  4+1) );.    sqli
8d70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8d80: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c   OP_Function, 1,
8d90: 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 54 65   regStat4, regTe
8da0: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
8db0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
8dc0: 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  -1, (char*)&stat
8dd0: 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f  PushFuncdef, P4_
8de0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
8df0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8e00: 35 28 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29  5(v, 2+IsStat34)
8e10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
8e30: 78 74 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  xt, iIdxCur, add
8e40: 72 4e 65 78 74 52 6f 77 29 3b 0a 0a 20 20 20 20  rNextRow);..    
8e50: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
8e60: 20 74 6f 20 74 68 65 20 73 74 61 74 31 20 74 61   to the stat1 ta
8e70: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c 6c  ble. */.    call
8e80: 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74  StatGet(v, regSt
8e90: 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 53 54  at4, STAT_GET_ST
8ea0: 41 54 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a  AT1, regStat1);.
8eb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ec0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
8ed0: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
8ee0: 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20  me, 3, regTemp, 
8ef0: 22 61 61 61 22 2c 20 30 29 3b 0a 20 20 20 20 73  "aaa", 0);.    s
8f00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f10: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8f20: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65   iStatCur, regNe
8f30: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
8f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8f50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
8f60: 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20  atCur, regTemp, 
8f70: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
8f80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8f90: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
8fa0: 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20 2f 2a  APPEND);..    /*
8fb0: 20 41 64 64 20 74 68 65 20 65 6e 74 72 69 65 73   Add the entries
8fc0: 20 74 6f 20 74 68 65 20 73 74 61 74 33 20 6f 72   to the stat3 or
8fd0: 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f   stat4 table. */
8fe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8ff0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
9000: 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20 20 20  TAT4.    {.     
9010: 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72 65 67   int regEq = reg
9020: 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69 6e 74  Stat1;.      int
9030: 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74 61 74   regLt = regStat
9040: 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+1;.      int r
9050: 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61 74 31  egDLt = regStat1
9060: 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  +2;.      int re
9070: 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53 74 61  gSample = regSta
9080: 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+3;.      int 
9090: 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74 61 74  regCol = regStat
90a0: 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+4;.      int r
90b0: 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 3d 20  egSampleRowid = 
90c0: 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b 0a 20  regCol + nCol;. 
90d0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78       int addrNex
90e0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
90f0: 72 49 73 4e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20  rIsNull;..      
9100: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d  pParse->nMem = M
9110: 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  AX(pParse->nMem,
9120: 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 2b 31 29 3b   regCol+nCol+1);
9130: 0a 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  ..      addrNext
9140: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
9150: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
9160: 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28      callStatGet(
9170: 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41  v, regStat4, STA
9180: 54 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65 67  T_GET_ROWID, reg
9190: 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20  SampleRowid);.  
91a0: 20 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d      addrIsNull =
91b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
91c0: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
91d0: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29   regSampleRowid)
91e0: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
91f0: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
9200: 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 2c 20 72   STAT_GET_NEQ, r
9210: 65 67 45 71 29 3b 0a 20 20 20 20 20 20 63 61 6c  egEq);.      cal
9220: 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53  lStatGet(v, regS
9230: 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e  tat4, STAT_GET_N
9240: 4c 54 2c 20 72 65 67 4c 74 29 3b 0a 20 20 20 20  LT, regLt);.    
9250: 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c    callStatGet(v,
9260: 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f   regStat4, STAT_
9270: 47 45 54 5f 4e 44 4c 54 2c 20 72 65 67 44 4c 74  GET_NDLT, regDLt
9280: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9290: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
92a0: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 54 61 62  _NotExists, iTab
92b0: 43 75 72 2c 20 61 64 64 72 4e 65 78 74 2c 20 72  Cur, addrNext, r
92c0: 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a  egSampleRowid);.
92d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
92e0: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20  ABLE_STAT3.     
92f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9300: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
9310: 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 43 75  (v, pTab, iTabCu
9320: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9350: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65 67  aiColumn[0], reg
9360: 53 61 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20  Sample);.#else. 
9370: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9380: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9390: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
93a0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
93b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
93c0: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
93d0: 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
93e0: 62 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  b, iTabCur, iCol
93f0: 2c 20 72 65 67 43 6f 6c 2b 69 29 3b 0a 20 20 20  , regCol+i);.   
9400: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9410: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9420: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
9430: 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2b 31 2c 20 72  egCol, nCol+1, r
9440: 65 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6e 64 69  egSample);.#endi
9450: 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  f.      sqlite3V
9460: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9470: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
9480: 61 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67 54 65  abname, 6, regTe
9490: 6d 70 2c 20 22 62 62 62 62 62 62 22 2c 20 30 29  mp, "bbbbbb", 0)
94a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
94b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
94c0: 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43  NewRowid, iStatC
94d0: 75 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f 77 69  ur+1, regNewRowi
94e0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
94f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9500: 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43  P_Insert, iStatC
9510: 75 72 2b 31 2c 20 72 65 67 54 65 6d 70 2c 20 72  ur+1, regTemp, r
9520: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
9530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9540: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
9550: 20 30 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20   0, addrNext);. 
9560: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9570: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
9580: 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23  IsNull);.    }.#
9590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
95a0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
95b0: 53 54 41 54 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a  STAT4 */..    /*
95c0: 20 45 6e 64 20 6f 66 20 61 6e 61 6c 79 73 69 73   End of analysis
95d0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
95e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
95f0: 64 64 72 52 65 77 69 6e 64 29 3b 0a 20 20 20 20  ddrRewind);.    
9600: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9610: 2c 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a 20 20  , aGotoChng);.  
9620: 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  }...  /* Create 
9630: 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65 5f  a single sqlite_
9640: 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f 6e 74  stat1 entry cont
9650: 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74  aining NULL as t
9660: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6e 61  he index.  ** na
9670: 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77 20 63  me and the row c
9680: 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f 6e 74  ount as the cont
9690: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ent..  */.  if( 
96a0: 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26 20 6e  pOnlyIdx==0 && n
96b0: 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b 0a 20  eedTableCnt ){. 
96c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
96d0: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
96e0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Name));.    sqli
96f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9700: 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61 62 43   OP_Count, iTabC
9710: 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20  ur, regStat1);. 
9720: 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73     jZeroRows = s
9730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
9740: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
9750: 67 53 74 61 74 31 29 3b 0a 20 20 20 20 73 71 6c  gStat1);.    sql
9760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9770: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
9780: 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20 20 20 73  gIdxname);.    s
9790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
97a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
97b0: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33  d, regTabname, 3
97c0: 2c 20 72 65 67 54 65 6d 70 2c 20 22 61 61 61 22  , regTemp, "aaa"
97d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
97e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
97f0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
9800: 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  tCur, regNewRowi
9810: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
9820: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9830: 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72  Insert, iStatCur
9840: 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65  , regTemp, regNe
9850: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
9860: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9870: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
9880: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
9890: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
98a0: 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d  ZeroRows);.  }.}
98b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
98c0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
98d0: 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20   cause the most 
98e0: 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61  recent index ana
98f0: 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c  lysis to.** be l
9900: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
9910: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
9920: 77 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20  where is can be 
9930: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
9940: 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69  void loadAnalysi
9950: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
9960: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
9970: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
9980: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9990: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
99a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
99b0: 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73  v, OP_LoadAnalys
99c0: 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a  is, iDb);.  }.}.
99d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
99e0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64  code that will d
99f0: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
9a00: 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
9a10: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ase.*/.static vo
9a20: 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61  id analyzeDataba
9a30: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
9a40: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
9a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9a60: 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61  se->db;.  Schema
9a70: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
9a80: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
9a90: 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ;    /* Schema o
9aa0: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a  f database iDb *
9ab0: 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
9ac0: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b  .  int iStatCur;
9ad0: 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
9ae0: 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69  nt iTab;..  sqli
9af0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
9b00: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
9b10: 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43  , iDb);.  iStatC
9b20: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
9b30: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
9b40: 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74  b += 3;.  openSt
9b50: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
9b60: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30  iDb, iStatCur, 0
9b70: 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70  , 0);.  iMem = p
9b80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9b90: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
9ba0: 6e 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  nTab;.  assert( 
9bb0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
9bc0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
9bd0: 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71  0) );.  for(k=sq
9be0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
9bf0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
9c00: 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
9c10: 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54  hNext(k)){.    T
9c20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
9c30: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
9c40: 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c  ata(k);.    anal
9c50: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72  yzeOneTable(pPar
9c60: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74  se, pTab, 0, iSt
9c70: 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61  atCur, iMem, iTa
9c80: 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e  b);.  }.  loadAn
9c90: 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69  alysis(pParse, i
9ca0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Db);.}../*.** Ge
9cb0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
9cc0: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
9cd0: 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ysis of a single
9ce0: 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64   table in.** a d
9cf0: 61 74 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e  atabase.  If pOn
9d00: 6c 79 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c  lyIdx is not NUL
9d10: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73  L then it is a s
9d20: 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69  ingle index.** i
9d30: 6e 20 70 54 61 62 20 74 68 61 74 20 73 68 6f 75  n pTab that shou
9d40: 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  ld be analyzed..
9d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
9d60: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73  nalyzeTable(Pars
9d70: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
9d80: 20 2a 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70   *pTab, Index *p
9d90: 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20  OnlyIdx){.  int 
9da0: 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74  iDb;.  int iStat
9db0: 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cur;..  assert( 
9dc0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
9dd0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
9de0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
9df0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
9e00: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
9e10: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
9e20: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
9e30: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9e40: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
9e50: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
9e60: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
9e70: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
9e80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
9e90: 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e   += 3;.  if( pOn
9ea0: 6c 79 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65  lyIdx ){.    ope
9eb0: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
9ec0: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
9ed0: 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d  , pOnlyIdx->zNam
9ee0: 65 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c  e, "idx");.  }el
9ef0: 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74  se{.    openStat
9f00: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
9f10: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61  b, iStatCur, pTa
9f20: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29  b->zName, "tbl")
9f30: 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f  ;.  }.  analyzeO
9f40: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
9f50: 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20  pTab, pOnlyIdx, 
9f60: 69 53 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d  iStatCur,pParse-
9f70: 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e  >nMem+1,pParse->
9f80: 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61  nTab);.  loadAna
9f90: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
9fa0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
9fb0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
9fc0: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
9fd0: 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  nd.  The parser 
9fe0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
9ff0: 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65  ne.** when it re
a000: 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c  cognizes an ANAL
a010: 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
a020: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
a030: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
a050: 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  1.**        ANAL
a060: 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20  YZE  <database> 
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
a080: 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 2.**        AN
a090: 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73  ALYZE  ?<databas
a0a0: 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
a0b0: 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 3.**.** Form
a0c0: 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
a0d0: 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
a0e0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
a0f0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  to be analyzed..
a100: 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a  ** Form 2 analyz
a110: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74  es all indices t
a120: 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  he single databa
a130: 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72  se named..** For
a140: 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 3 analyzes all
a150: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
a160: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
a170: 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ed table..*/.voi
a180: 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65  d sqlite3Analyze
a190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a1a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
a1b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
a1c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a1d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a1e0: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   iDb;.  int i;. 
a1f0: 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a   char *z, *zDb;.
a200: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a210: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
a220: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
a230: 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  e;..  /* Read th
a240: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
a250: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
a260: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
a270: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
a280: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
a290: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
a2a0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65   NULL. */.  asse
a2b0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
a2c0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
a2d0: 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20  pParse->db) );. 
a2e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a2f0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
a300: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
a310: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
a320: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d  assert( pName2!=
a330: 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29  0 || pName1==0 )
a340: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ;.  if( pName1==
a350: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d  0 ){.    /* Form
a360: 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76 65   1:  Analyze eve
a370: 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66  rything */.    f
a380: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a390: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
a3a0: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  f( i==1 ) contin
a3b0: 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ue;  /* Do not a
a3c0: 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50 20  nalyze the TEMP 
a3d0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
a3e0: 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73    analyzeDatabas
a3f0: 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  e(pParse, i);.  
a400: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
a410: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  pName2->n==0 ){.
a420: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20 20      /* Form 2:  
a430: 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74 61  Analyze the data
a440: 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e 61  base or table na
a450: 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  med */.    iDb =
a460: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
a470: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
a480: 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
a490: 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62      analyzeDatab
a4a0: 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ase(pParse, iDb)
a4b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4c0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61     z = sqlite3Na
a4d0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
a4e0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 69  pName1);.      i
a4f0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
a500: 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69  if( (pIdx = sqli
a510: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
a520: 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20   z, 0))!=0 ){.  
a530: 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54          analyzeT
a540: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49 64  able(pParse, pId
a550: 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78 29  x->pTable, pIdx)
a560: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
a570: 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c 69  if( (pTab = sqli
a580: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
a590: 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 30 29 29  Parse, 0, z, 0))
a5a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
a5b0: 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50   analyzeTable(pP
a5c0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
a5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a5f0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  db, z);.      }.
a600: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
a610: 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41 6e     /* Form 3: An
a620: 61 6c 79 7a 65 20 74 68 65 20 66 75 6c 6c 79 20  alyze the fully 
a630: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
a640: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  name */.    iDb 
a650: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
a660: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
a670: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54  me1, pName2, &pT
a680: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ableName);.    i
a690: 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
a6a0: 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
a6b0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
a6c0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61     z = sqlite3Na
a6d0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
a6e0: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  pTableName);.   
a6f0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
a700: 20 20 20 20 69 66 28 20 28 70 49 64 78 20 3d 20      if( (pIdx = 
a710: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
a720: 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30  (db, z, zDb))!=0
a730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 6e   ){.          an
a740: 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72 73  alyzeTable(pPars
a750: 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  e, pIdx->pTable,
a760: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
a770: 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62 20  }else if( (pTab 
a780: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a790: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a7a0: 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20  z, zDb))!=0 ){. 
a7b0: 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65           analyze
a7c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
a7d0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
a7e0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
a7f0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
a800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20        }.    }   
a810: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
a820: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
a830: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
a840: 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72 20  analyzer reader 
a850: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a  through to the.*
a860: 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  * callback routi
a870: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
a880: 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e  truct analysisIn
a890: 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b  fo analysisInfo;
a8a0: 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73  .struct analysis
a8b0: 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33  Info {.  sqlite3
a8c0: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
a8d0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d  ar *zDatabase;.}
a8e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  ;../*.** The fir
a8f0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  st argument poin
a900: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
a910: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
a920: 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69  ntaining a.** li
a930: 73 74 20 6f 66 20 73 70 61 63 65 20 73 65 70 61  st of space sepa
a940: 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20  rated integers. 
a950: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 6e  Read the first n
a960: 4f 75 74 20 6f 66 20 74 68 65 73 65 20 69 6e 74  Out of these int
a970: 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61  o.** the array a
a980: 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  Out[]..*/.static
a990: 20 76 6f 69 64 20 64 65 63 6f 64 65 49 6e 74 41   void decodeIntA
a9a0: 72 72 61 79 28 0a 20 20 63 68 61 72 20 2a 7a 49  rray(.  char *zI
a9b0: 6e 74 41 72 72 61 79 2c 20 0a 20 20 69 6e 74 20  ntArray, .  int 
a9c0: 6e 4f 75 74 2c 20 0a 20 20 74 52 6f 77 63 6e 74  nOut, .  tRowcnt
a9d0: 20 2a 61 4f 75 74 2c 20 0a 20 20 69 6e 74 20 2a   *aOut, .  int *
a9e0: 70 62 55 6e 6f 72 64 65 72 65 64 0a 29 7b 0a 20  pbUnordered.){. 
a9f0: 20 63 68 61 72 20 2a 7a 20 3d 20 7a 49 6e 74 41   char *z = zIntA
aa00: 72 72 61 79 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  rray;.  int c;. 
aa10: 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e   int i;.  tRowcn
aa20: 74 20 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t v;..  assert( 
aa30: 70 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 7c  pbUnordered==0 |
aa40: 7c 20 2a 70 62 55 6e 6f 72 64 65 72 65 64 3d 3d  | *pbUnordered==
aa50: 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
aa60: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
aa70: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
aa80: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23  z==0 ) z = "";.#
aa90: 65 6c 73 65 0a 20 20 69 66 28 20 4e 45 56 45 52  else.  if( NEVER
aaa0: 28 7a 3d 3d 30 29 20 29 20 7a 20 3d 20 22 22 3b  (z==0) ) z = "";
aab0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
aac0: 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f 75 74 3b  0; *z && i<nOut;
aad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30   i++){.    v = 0
aae0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  ;.    while( (c=
aaf0: 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c  z[0])>='0' && c<
ab00: 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20  ='9' ){.      v 
ab10: 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27  = v*10 + c - '0'
ab20: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
ab30: 20 7d 0a 20 20 20 20 61 4f 75 74 5b 69 5d 20 3d   }.    aOut[i] =
ab40: 20 76 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d   v;.    if( *z==
ab50: 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ' ' ) z++;.  }. 
ab60: 20 69 66 28 20 70 62 55 6e 6f 72 64 65 72 65 64   if( pbUnordered
ab70: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 20 22 75   && strcmp(z, "u
ab80: 6e 6f 72 64 65 72 65 64 22 29 3d 3d 30 20 29 7b  nordered")==0 ){
ab90: 0a 20 20 20 20 2a 70 62 55 6e 6f 72 64 65 72 65  .    *pbUnordere
aba0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
abb0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
abc0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  k is invoked onc
abd0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  e for each index
abe0: 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68   when reading th
abf0: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
ac00: 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  1 table.  .**.**
ac10: 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e       argv[0] = n
ac20: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
ac30: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20  .**     argv[1] 
ac40: 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  = name of the in
ac50: 64 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55  dex (might be NU
ac60: 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  LL).**     argv[
ac70: 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20  2] = results of 
ac80: 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e  analysis - on in
ac90: 74 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63  teger for each c
aca0: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72  olumn.**.** Entr
acb0: 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72  ies for which ar
acc0: 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70  gv[1]==NULL simp
acd0: 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  ly record the nu
ace0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
acf0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
ad00: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
ad10: 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20  ysisLoader(void 
ad20: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
ad30: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
ad40: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
ad50: 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a    analysisInfo *
ad60: 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69  pInfo = (analysi
ad70: 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20  sInfo*)pData;.  
ad80: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
ad90: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
ada0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
adb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
adc0: 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==3 );.  UNUSED_
add0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
ade0: 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69 66  ed, argc);..  if
adf0: 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67  ( argv==0 || arg
ae00: 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b  v[0]==0 || argv[
ae10: 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  2]==0 ){.    ret
ae20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
ae30: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
ae40: 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e 64 62  dTable(pInfo->db
ae50: 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f  , argv[0], pInfo
ae60: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
ae70: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
ae80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ae90: 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d   }.  if( argv[1]
aea0: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d   ){.    pIndex =
aeb0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
aec0: 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67  x(pInfo->db, arg
aed0: 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61  v[1], pInfo->zDa
aee0: 74 61 62 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65  tabase);.  }else
aef0: 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  {.    pIndex = 0
af00: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76  ;.  }.  z = argv
af10: 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64  [2];..  if( pInd
af20: 65 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55  ex ){.    int bU
af30: 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  nordered = 0;.  
af40: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
af50: 28 28 63 68 61 72 2a 29 7a 2c 20 70 49 6e 64 65  ((char*)z, pInde
af60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 70 49  x->nColumn+1, pI
af70: 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 2c 26  ndex->aiRowEst,&
af80: 62 55 6e 6f 72 64 65 72 65 64 29 3b 0a 20 20 20  bUnordered);.   
af90: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 50 61   if( pIndex->pPa
afa0: 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20  rtIdxWhere==0 ) 
afb0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20  pTable->nRowEst 
afc0: 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  = pIndex->aiRowE
afd0: 73 74 5b 30 5d 3b 0a 20 20 20 20 70 49 6e 64 65  st[0];.    pInde
afe0: 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d 20  x->bUnordered = 
aff0: 62 55 6e 6f 72 64 65 72 65 64 3b 0a 20 20 7d 65  bUnordered;.  }e
b000: 6c 73 65 7b 0a 20 20 20 20 64 65 63 6f 64 65 49  lse{.    decodeI
b010: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a  ntArray((char*)z
b020: 2c 20 31 2c 20 26 70 54 61 62 6c 65 2d 3e 6e 52  , 1, &pTable->nR
b030: 6f 77 45 73 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a  owEst, 0);.  }..
b040: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b050: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 6e 64 65  *.** If the Inde
b060: 78 2e 61 53 61 6d 70 6c 65 20 76 61 72 69 61 62  x.aSample variab
b070: 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  le is not NULL, 
b080: 64 65 6c 65 74 65 20 74 68 65 20 61 53 61 6d 70  delete the aSamp
b090: 6c 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e  le[] array.** an
b0a0: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a  d its contents..
b0b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
b0c0: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
b0d0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  s(sqlite3 *db, I
b0e0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 23 69 66  ndex *pIdx){.#if
b0f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b100: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b110: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61  .  if( pIdx->aSa
b120: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  mple ){.    int 
b130: 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  j;.    for(j=0; 
b140: 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  j<pIdx->nSample;
b150: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64   j++){.      Ind
b160: 65 78 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70  exSample *p = &p
b170: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b  Idx->aSample[j];
b180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
b190: 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a  Free(db, p->p);.
b1a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b1b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
b1c0: 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a  ->aSample);.  }.
b1d0: 20 20 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e    if( db && db->
b1e0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
b1f0: 29 7b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61  ){.    pIdx->nSa
b200: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  mple = 0;.    pI
b210: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->aSample = 0;
b220: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
b230: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
b240: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
b250: 4d 45 54 45 52 28 70 49 64 78 29 3b 0a 23 65 6e  METER(pIdx);.#en
b260: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
b270: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b280: 41 54 34 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66  AT4 */.}..#ifdef
b290: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
b2a0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
b2b0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
b2c0: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 5d 20   pIdx->aAvgEq[] 
b2d0: 61 72 72 61 79 20 62 61 73 65 64 20 6f 6e 20 74  array based on t
b2e0: 68 65 20 73 61 6d 70 6c 65 73 20 63 75 72 72 65  he samples curre
b2f0: 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ntly.** stored i
b300: 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b  n pIdx->aSample[
b310: 5d 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ]. .*/.static vo
b320: 69 64 20 69 6e 69 74 41 76 67 45 71 28 49 6e 64  id initAvgEq(Ind
b330: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
b340: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 49 6e 64   pIdx ){.    Ind
b350: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
b360: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
b370: 65 3b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70  e;.    IndexSamp
b380: 6c 65 20 2a 70 46 69 6e 61 6c 20 3d 20 26 61 53  le *pFinal = &aS
b390: 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d  ample[pIdx->nSam
b3a0: 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 69 6e 74 20  ple-1];.    int 
b3b0: 69 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 43  iCol;.    for(iC
b3c0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 49 64 78 2d  ol=0; iCol<pIdx-
b3d0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
b3e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
b410: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 61  erate through sa
b420: 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 74  mples */.      t
b430: 52 6f 77 63 6e 74 20 73 75 6d 45 71 20 3d 20 30  Rowcnt sumEq = 0
b440: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 75 6d 20  ;        /* Sum 
b450: 6f 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  of the nEq value
b460: 73 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  s */.      tRowc
b470: 6e 74 20 6e 53 75 6d 20 3d 20 30 3b 20 20 20 20  nt nSum = 0;    
b480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b490: 66 20 74 65 72 6d 73 20 63 6f 6e 74 72 69 62 75  f terms contribu
b4a0: 74 69 6e 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f  ting to sumEq */
b4b0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
b4c0: 76 67 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  vgEq = 0;.      
b4d0: 74 52 6f 77 63 6e 74 20 6e 44 4c 74 20 3d 20 70  tRowcnt nDLt = p
b4e0: 46 69 6e 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43 6f  Final->anDLt[iCo
b4f0: 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  l];..      /* Se
b500: 74 20 6e 53 75 6d 20 74 6f 20 74 68 65 20 6e 75  t nSum to the nu
b510: 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
b520: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
b530: 70 72 65 66 69 78 65 73 20 74 68 61 74 0a 20 20  prefixes that.  
b540: 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 69 6e 20      ** occur in 
b550: 74 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 20  the stat4 table 
b560: 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 20 62  for this index b
b570: 65 66 6f 72 65 20 70 46 69 6e 61 6c 2e 20 53 65  efore pFinal. Se
b580: 74 0a 20 20 20 20 20 20 2a 2a 20 73 75 6d 45 71  t.      ** sumEq
b590: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
b5a0: 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 66 6f  he nEq values fo
b5b0: 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f  r column iCol fo
b5c0: 72 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  r the same.     
b5d0: 20 2a 2a 20 73 65 74 20 28 61 64 64 69 6e 67 20   ** set (adding 
b5e0: 74 68 65 20 76 61 6c 75 65 20 6f 6e 6c 79 20 6f  the value only o
b5f0: 6e 63 65 20 77 68 65 72 65 20 74 68 65 72 65 20  nce where there 
b600: 65 78 69 73 74 20 64 75 70 69 63 61 74 65 20 0a  exist dupicate .
b610: 20 20 20 20 20 20 2a 2a 20 70 72 65 66 69 78 65        ** prefixe
b620: 73 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  s).  */.      fo
b630: 72 28 69 3d 30 3b 20 69 3c 28 70 49 64 78 2d 3e  r(i=0; i<(pIdx->
b640: 6e 53 61 6d 70 6c 65 2d 31 29 3b 20 69 2b 2b 29  nSample-1); i++)
b650: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
b660: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69  ample[i].anDLt[i
b670: 43 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b  Col]!=aSample[i+
b680: 31 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 29  1].anDLt[iCol] )
b690: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 75 6d 45  {.          sumE
b6a0: 71 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  q += aSample[i].
b6b0: 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anEq[iCol];.    
b6c0: 20 20 20 20 20 20 6e 53 75 6d 2b 2b 3b 0a 20 20        nSum++;.  
b6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 6e 44 4c 74 3e 6e        if( nDLt>n
b6f0: 53 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Sum ){.        a
b700: 76 67 45 71 20 3d 20 28 70 46 69 6e 61 6c 2d 3e  vgEq = (pFinal->
b710: 61 6e 4c 74 5b 69 43 6f 6c 5d 20 2d 20 73 75 6d  anLt[iCol] - sum
b720: 45 71 29 2f 28 6e 44 4c 74 20 2d 20 6e 53 75 6d  Eq)/(nDLt - nSum
b730: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b740: 20 69 66 28 20 61 76 67 45 71 3d 3d 30 20 29 20   if( avgEq==0 ) 
b750: 61 76 67 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  avgEq = 1;.     
b760: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
b770: 6f 6c 5d 20 3d 20 61 76 67 45 71 3b 0a 20 20 20  ol] = avgEq;.   
b780: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 53 61     if( pIdx->nSa
b790: 6d 70 6c 65 43 6f 6c 3d 3d 31 20 29 20 62 72 65  mpleCol==1 ) bre
b7a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
b7b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
b7c0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69 74  content from eit
b7d0: 68 65 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73  her the sqlite_s
b7e0: 74 61 74 34 20 6f 72 20 73 71 6c 69 74 65 5f 73  tat4 or sqlite_s
b7f0: 74 61 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20 69  tat3 table .** i
b800: 6e 74 6f 20 74 68 65 20 72 65 6c 65 76 61 6e 74  nto the relevant
b810: 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d   Index.aSample[]
b820: 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 41   arrays..**.** A
b830: 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20 61  rguments zSql1 a
b840: 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74 20 70 6f  nd zSql2 must po
b850: 69 6e 74 20 74 6f 20 53 51 4c 20 73 74 61 74 65  int to SQL state
b860: 6d 65 6e 74 73 20 74 68 61 74 20 72 65 74 75 72  ments that retur
b870: 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75 69 76 61  n.** data equiva
b880: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
b890: 6f 77 69 6e 67 20 28 73 74 61 74 65 6d 65 6e 74  owing (statement
b8a0: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  s are different 
b8b0: 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73 65  for stat3,.** se
b8c0: 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  e the caller of 
b8d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f  this function fo
b8e0: 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a 2a  r details):.**.*
b8f0: 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c 45  *    zSql1: SELE
b900: 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20  CT idx,count(*) 
b910: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
b920: 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69 64  tat4 GROUP BY id
b930: 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20 53  x.**    zSql2: S
b940: 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c  ELECT idx,neq,nl
b950: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52  t,ndlt,sample FR
b960: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
b970: 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 25  t4.**.** where %
b980: 51 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69  Q is replaced wi
b990: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
b9a0: 6e 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  name before the 
b9b0: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
b9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
b9d0: 6f 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73 71  oadStatTbl(.  sq
b9e0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ba00: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
ba10: 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 33 2c 20  /.  int bStat3, 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e 67    /* Assume sing
ba40: 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72 64  le column record
ba50: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73  s only */.  cons
ba60: 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20 20  t char *zSql1,  
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
ba80: 20 73 74 61 74 65 6d 65 6e 74 20 31 20 28 73 65   statement 1 (se
ba90: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63 6f  e above) */.  co
baa0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 2c  nst char *zSql2,
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bac0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 32 20 28  QL statement 2 (
bad0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
bae0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb00: 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   Database name (
bb10: 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a  e.g. "main") */.
bb20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bb50: 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  es from subrouti
bb60: 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nes */.  sqlite3
bb70: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
bb80: 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c  ;      /* An SQL
bb90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
bba0: 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a   run */.  char *
bbb0: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
bbc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
bbd0: 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
bbe0: 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ment */.  Index 
bbf0: 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20 20  *pPrevIdx = 0;  
bc00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
bc10: 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ous index in the
bc20: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65 78   loop */.  Index
bc30: 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b  Sample *pSample;
bc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6c           /* A sl
bc50: 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d  ot in pIdx->aSam
bc60: 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ple[] */..  asse
bc70: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
bc80: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
bc90: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
bca0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53 71  3MPrintf(db, zSq
bcb0: 6c 31 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  l1, zDb);.  if( 
bcc0: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zSql ){.    ret
bcd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
bce0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bcf0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
bd00: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
bd10: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
bd20: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
bd30: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
bd40: 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
bd50: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
bd60: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
bd70: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64  W ){.    int nId
bd80: 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  xCol = 1;       
bd90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bda0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73   of columns in s
bdb0: 74 61 74 34 20 72 65 63 6f 72 64 73 20 2a 2f 0a  tat4 records */.
bdc0: 20 20 20 20 69 6e 74 20 6e 41 76 67 43 6f 6c 20      int nAvgCol 
bdd0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
bde0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
bdf0: 6e 74 72 69 65 73 20 69 6e 20 49 6e 64 65 78 2e  ntries in Index.
be00: 61 41 76 67 45 71 20 2a 2f 0a 0a 20 20 20 20 63  aAvgEq */..    c
be10: 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f  har *zIndex;   /
be20: 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a  * Index name */.
be30: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
be40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
be50: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65  o the index obje
be60: 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  ct */.    int nS
be70: 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d  ample;    /* Num
be80: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
be90: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
bea0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
beb0: 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  f space required
bec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   */.    int i;  
bed0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
bee0: 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72   of space requir
bef0: 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  ed */.    tRowcn
bf00: 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20 20  t *pSpace;..    
bf10: 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a  zIndex = (char *
bf20: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
bf30: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
bf40: 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d      if( zIndex==
bf50: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
bf60: 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69    nSample = sqli
bf70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
bf80: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70 49  Stmt, 1);.    pI
bf90: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
bfa0: 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e 64 65 78  Index(db, zIndex
bfb0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 61 73 73 65  , zDb);.    asse
bfc0: 72 74 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62  rt( pIdx==0 || b
bfd0: 53 74 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e  Stat3 || pIdx->n
bfe0: 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  Sample==0 );.   
bff0: 20 2f 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c   /* Index.nSampl
c000: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74  e is non-zero at
c010: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 64   this point if d
c020: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
c030: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  been.    ** load
c040: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
c050: 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73  4 table. In this
c060: 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61   case ignore sta
c070: 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  t3 data.  */.   
c080: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20   if( pIdx==0 || 
c090: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20  pIdx->nSample ) 
c0a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
c0b0: 28 20 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20  ( bStat3==0 ){. 
c0c0: 20 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70       nIdxCol = p
c0d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 0a  Idx->nColumn+1;.
c0e0: 20 20 20 20 20 20 6e 41 76 67 43 6f 6c 20 3d 20        nAvgCol = 
c0f0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
c100: 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e     }.    pIdx->n
c110: 53 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78  SampleCol = nIdx
c120: 43 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  Col;.    nByte =
c130: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d   sizeof(IndexSam
c140: 70 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a  ple) * nSample;.
c150: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a      nByte += siz
c160: 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e  eof(tRowcnt) * n
c170: 49 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61  IdxCol * 3 * nSa
c180: 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20  mple;.    nByte 
c190: 2b 3d 20 6e 41 76 67 43 6f 6c 20 2a 20 73 69 7a  += nAvgCol * siz
c1a0: 65 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20 20 20  eof(tRowcnt);   
c1b0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 49    /* Space for I
c1c0: 6e 64 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f  ndex.aAvgEq[] */
c1d0: 0a 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d  ..    pIdx->aSam
c1e0: 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ple = sqlite3DbM
c1f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
c200: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  yte);.    if( pI
c210: 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29  dx->aSample==0 )
c220: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c230: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
c240: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c250: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c260: 7d 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20 28  }.    pSpace = (
c270: 74 52 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e  tRowcnt*)&pIdx->
c280: 61 53 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d  aSample[nSample]
c290: 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67  ;.    pIdx->aAvg
c2a0: 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70  Eq = pSpace; pSp
c2b0: 61 63 65 20 2b 3d 20 6e 41 76 67 43 6f 6c 3b 0a  ace += nAvgCol;.
c2c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c2d0: 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
c2e0: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
c2f0: 65 5b 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61  e[i].anEq = pSpa
c300: 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49  ce; pSpace += nI
c310: 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64  dxCol;.      pId
c320: 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e  x->aSample[i].an
c330: 4c 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70  Lt = pSpace; pSp
c340: 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a  ace += nIdxCol;.
c350: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d        pIdx->aSam
c360: 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70  ple[i].anDLt = p
c370: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
c380: 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a   nIdxCol;.    }.
c390: 20 20 20 20 61 73 73 65 72 74 28 20 28 28 75 38      assert( ((u8
c3a0: 2a 29 70 53 70 61 63 65 29 2d 6e 42 79 74 65 3d  *)pSpace)-nByte=
c3b0: 3d 28 75 38 2a 29 28 70 49 64 78 2d 3e 61 53 61  =(u8*)(pIdx->aSa
c3c0: 6d 70 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72  mple) );.  }.  r
c3d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
c3e0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
c3f0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c400: 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  c;..  zSql = sql
c410: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c420: 7a 53 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69  zSql2, zDb);.  i
c430: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
c440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c450: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
c460: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
c470: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
c480: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
c490: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
c4a0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
c4b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
c4c0: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
c4d0: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
c4e0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72  _ROW ){.    char
c4f0: 20 2a 7a 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *zIndex;       
c500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c510: 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49  ex name */.    I
c520: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  Pointer to the i
c550: 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
c560: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b     int nCol = 1;
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c590: 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a  lumns in index *
c5a0: 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20  /..    zIndex = 
c5b0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
c5c0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
c5d0: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  t, 0);.    if( z
c5e0: 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69  Index==0 ) conti
c5f0: 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  nue;.    pIdx = 
c600: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
c610: 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62  (db, zIndex, zDb
c620: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d  );.    if( pIdx=
c630: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
c640: 20 20 20 2f 2a 20 54 68 69 73 20 6e 65 78 74 20     /* This next 
c650: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
c660: 65 20 69 66 20 64 61 74 61 20 68 61 73 20 61 6c  e if data has al
c670: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
c680: 64 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74  d from .    ** t
c690: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  he sqlite_stat4 
c6a0: 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  table. In this c
c6b0: 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33  ase ignore stat3
c6c0: 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 6e   data.  */.    n
c6d0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  Col = pIdx->nSam
c6e0: 70 6c 65 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  pleCol;.    if( 
c6f0: 62 53 74 61 74 33 20 26 26 20 6e 43 6f 6c 3e 31  bStat3 && nCol>1
c700: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c710: 20 69 66 28 20 70 49 64 78 21 3d 70 50 72 65 76   if( pIdx!=pPrev
c720: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 69  Idx ){.      ini
c730: 74 41 76 67 45 71 28 70 50 72 65 76 49 64 78 29  tAvgEq(pPrevIdx)
c740: 3b 0a 20 20 20 20 20 20 70 50 72 65 76 49 64 78  ;.      pPrevIdx
c750: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20   = pIdx;.    }. 
c760: 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 49     pSample = &pI
c770: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78  dx->aSample[pIdx
c780: 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20  ->nSample];.    
c790: 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28  decodeIntArray((
c7a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
c7b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
c7c0: 31 29 2c 20 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c  1), nCol, pSampl
c7d0: 65 2d 3e 61 6e 45 71 2c 20 30 29 3b 0a 20 20 20  e->anEq, 0);.   
c7e0: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
c7f0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
c800: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
c810: 2c 32 29 2c 20 6e 43 6f 6c 2c 20 70 53 61 6d 70  ,2), nCol, pSamp
c820: 6c 65 2d 3e 61 6e 4c 74 2c 20 30 29 3b 0a 20 20  le->anLt, 0);.  
c830: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
c840: 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
c850: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
c860: 74 2c 33 29 2c 20 6e 43 6f 6c 2c 20 70 53 61 6d  t,3), nCol, pSam
c870: 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30 29 3b 0a 0a  ple->anDLt,0);..
c880: 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 20 63 6f      /* Take a co
c890: 70 79 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  py of the sample
c8a0: 2e 20 41 64 64 20 74 77 6f 20 30 78 30 30 20 62  . Add two 0x00 b
c8b0: 79 74 65 73 20 74 68 65 20 65 6e 64 20 6f 66 20  ytes the end of 
c8c0: 74 68 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  the buffer..    
c8d0: 2a 2a 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  ** This is in ca
c8e0: 73 65 20 74 68 65 20 73 61 6d 70 6c 65 20 72 65  se the sample re
c8f0: 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 65  cord is corrupte
c900: 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  d. In that case,
c910: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
c920: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
c930: 70 61 72 65 28 29 20 6d 61 79 20 72 65 61 64 20  pare() may read 
c940: 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
c950: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 2a  s past the.    *
c960: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  * end of the all
c970: 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 62 65  ocated buffer be
c980: 66 6f 72 65 20 69 74 20 72 65 61 6c 69 7a 65 73  fore it realizes
c990: 20 69 74 20 69 73 20 64 65 61 6c 69 6e 67 20 77   it is dealing w
c9a0: 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 63 6f 72  ith.    ** a cor
c9b0: 72 75 70 74 20 72 65 63 6f 72 64 2e 20 41 64 64  rupt record. Add
c9c0: 69 6e 67 20 74 68 65 20 74 77 6f 20 30 78 30 30  ing the two 0x00
c9d0: 20 62 79 74 65 73 20 70 72 65 76 65 6e 74 73 20   bytes prevents 
c9e0: 74 68 69 73 20 66 72 6f 6d 20 63 61 75 73 69 6e  this from causin
c9f0: 67 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  g.    ** a buffe
ca00: 72 20 6f 76 65 72 72 65 61 64 2e 20 20 2a 2f 0a  r overread.  */.
ca10: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d      pSample->n =
ca20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ca30: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 3b  bytes(pStmt, 4);
ca40: 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 70 20  .    pSample->p 
ca50: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ca60: 63 5a 65 72 6f 28 64 62 2c 20 70 53 61 6d 70 6c  cZero(db, pSampl
ca70: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 20 20 69  e->n + 2);.    i
ca80: 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30  f( pSample->p==0
ca90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
caa0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
cab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cad0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
cae0: 53 61 6d 70 6c 65 2d 3e 70 2c 20 73 71 6c 69 74  Sample->p, sqlit
caf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
cb00: 53 74 6d 74 2c 20 34 29 2c 20 70 53 61 6d 70 6c  Stmt, 4), pSampl
cb10: 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 49 64 78 2d  e->n);.    pIdx-
cb20: 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a  >nSample++;.  }.
cb30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
cb40: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
cb50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cb60: 5f 4f 4b 20 29 20 69 6e 69 74 41 76 67 45 71 28  _OK ) initAvgEq(
cb70: 70 50 72 65 76 49 64 78 29 3b 0a 20 20 72 65 74  pPrevIdx);.  ret
cb80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cb90: 20 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72   Load content fr
cba0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
cbb0: 61 74 34 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  at4 and sqlite_s
cbc0: 74 61 74 33 20 74 61 62 6c 65 73 20 69 6e 74 6f  tat3 tables into
cbd0: 20 0a 2a 2a 20 74 68 65 20 49 6e 64 65 78 2e 61   .** the Index.a
cbe0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 20  Sample[] arrays 
cbf0: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a  of all indices..
cc00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
cc10: 61 64 53 74 61 74 34 28 73 71 6c 69 74 65 33 20  adStat4(sqlite3 
cc20: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
cc30: 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  *zDb){.  int rc 
cc40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
cc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
cc60: 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75  lt codes from su
cc70: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20  broutines */..  
cc80: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
cc90: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
cca0: 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
ccb0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
ccc0: 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20  "sqlite_stat4", 
ccd0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  zDb) ){.    rc =
cce0: 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c   loadStatTbl(db,
ccf0: 20 30 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43   0,.      "SELEC
cd00: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
cd10: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
cd20: 61 74 34 20 47 52 4f 55 50 20 42 59 20 69 64 78  at4 GROUP BY idx
cd30: 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ", .      "SELEC
cd40: 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64  T idx,neq,nlt,nd
cd50: 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25  lt,sample FROM %
cd60: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c  Q.sqlite_stat4",
cd70: 0a 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29  .      zDb.    )
cd80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
cd90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
cda0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
cdb0: 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
cdc0: 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72  ", zDb) ){.    r
cdd0: 63 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c 28  c = loadStatTbl(
cde0: 64 62 2c 20 31 2c 0a 20 20 20 20 20 20 22 53 45  db, 1,.      "SE
cdf0: 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a  LECT idx,count(*
ce00: 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  ) FROM %Q.sqlite
ce10: 5f 73 74 61 74 33 20 47 52 4f 55 50 20 42 59 20  _stat3 GROUP BY 
ce20: 69 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53 45  idx", .      "SE
ce30: 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74  LECT idx,neq,nlt
ce40: 2c 6e 64 6c 74 2c 73 71 6c 69 74 65 5f 72 65 63  ,ndlt,sqlite_rec
ce50: 6f 72 64 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d  ord(sample) FROM
ce60: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33   %Q.sqlite_stat3
ce70: 22 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20 20  ",.      zDb.   
ce80: 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
ce90: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
cea0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
ceb0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
cec0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  /../*.** Load th
ced0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
cee0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e   sqlite_stat1 an
cef0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34  d sqlite_stat3/4
cf00: 20 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20   tables. The.** 
cf10: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69  contents of sqli
cf20: 74 65 5f 73 74 61 74 31 20 61 72 65 20 75 73 65  te_stat1 are use
cf30: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  d to populate th
cf40: 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
cf50: 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54 68  [].** arrays. Th
cf60: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71  e contents of sq
cf70: 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 61 72 65  lite_stat3/4 are
cf80: 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74   used to populat
cf90: 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61  e the.** Index.a
cfa0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e  Sample[] arrays.
cfb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71  .**.** If the sq
cfc0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
cfd0: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
cfe0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
cff0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a   SQLITE_ERROR.**
d000: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
d010: 20 74 68 69 73 20 63 61 73 65 2c 20 65 76 65 6e   this case, even
d020: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
d030: 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64 65  E_STAT3/4 was de
d040: 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67  fined .** during
d050: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64   compilation and
d060: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
d070: 33 2f 34 20 74 61 62 6c 65 20 69 73 20 70 72 65  3/4 table is pre
d080: 73 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20 69 73  sent, no data is
d090: 20 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 69   .** read from i
d0a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  t..**.** If SQLI
d0b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f  TE_ENABLE_STAT3/
d0c0: 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 64 75  4 was defined du
d0d0: 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  ring compilation
d0e0: 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c   and the .** sql
d0f0: 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20  ite_stat4 table 
d100: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
d110: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
d120: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 0a  SQLITE_ERROR is.
d130: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 48 6f 77  ** returned. How
d140: 65 76 65 72 2c 20 69 6e 20 74 68 69 73 20 63 61  ever, in this ca
d150: 73 65 2c 20 64 61 74 61 20 69 73 20 72 65 61 64  se, data is read
d160: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
d170: 5f 73 74 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20  _stat1.** table 
d180: 28 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e  (if it is presen
d190: 74 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  t) before return
d1a0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
d1b0: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
d1c0: 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
d1d0: 20 61 6c 77 61 79 73 20 73 65 74 73 20 64 62 2d   always sets db-
d1e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
d1f0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  * This means if 
d200: 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  the caller does 
d210: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 6f  not care about o
d220: 74 68 65 72 20 65 72 72 6f 72 73 2c 20 74 68 65  ther errors, the
d230: 20 72 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20   return.** code 
d240: 6d 61 79 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  may be ignored..
d250: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6e  */.int sqlite3An
d260: 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69 74  alysisLoad(sqlit
d270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
d280: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
d290: 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c   sInfo;.  HashEl
d2a0: 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a  em *i;.  char *z
d2b0: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Sql;.  int rc;..
d2c0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
d2d0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
d2f0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
d300: 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20   );..  /* Clear 
d310: 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74 69 73  any prior statis
d320: 74 69 63 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  tics */.  assert
d330: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
d340: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
d350: 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  , 0) );.  for(i=
d360: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
d370: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
d380: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b  chema->idxHash);
d390: 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
d3a0: 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65  xt(i)){.    Inde
d3b0: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
d3c0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
d3d0: 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
d3e0: 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 23 69 66  owEst(pIdx);.#if
d3f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d400: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
d410: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
d420: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
d430: 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70 49  b, pIdx);.    pI
d440: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->aSample = 0;
d450: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
d460: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
d470: 73 75 72 65 20 74 68 65 20 73 71 6c 69 74 65 5f  sure the sqlite_
d480: 73 74 61 74 31 20 74 61 62 6c 65 20 65 78 69 73  stat1 table exis
d490: 74 73 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62  ts */.  sInfo.db
d4a0: 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a   = db;.  sInfo.z
d4b0: 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61  Database = db->a
d4c0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
d4d0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
d4e0: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
d4f0: 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
d500: 7a 44 61 74 61 62 61 73 65 29 3d 3d 30 20 29 7b  zDatabase)==0 ){
d510: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d520: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
d530: 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
d540: 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
d550: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
d560: 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20  table */.  zSql 
d570: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d580: 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  (db, .      "SEL
d590: 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74  ECT tbl,idx,stat
d5a0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
d5b0: 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44  stat1", sInfo.zD
d5c0: 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
d5d0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
d5e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d5f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d600: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
d610: 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79  (db, zSql, analy
d620: 73 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66  sisLoader, &sInf
d630: 6f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  o, 0);.    sqlit
d640: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
d650: 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c  l);.  }...  /* L
d660: 6f 61 64 20 74 68 65 20 73 74 61 74 69 73 74 69  oad the statisti
d670: 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  cs from the sqli
d680: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20  te_stat4 table. 
d690: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d6a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d6b0: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 72 63 3d  _STAT4.  if( rc=
d6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d6d0: 20 20 69 6e 74 20 6c 6f 6f 6b 61 73 69 64 65 45    int lookasideE
d6e0: 6e 61 62 6c 65 64 20 3d 20 64 62 2d 3e 6c 6f 6f  nabled = db->loo
d6f0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
d700: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
d710: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
d720: 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74  .    rc = loadSt
d730: 61 74 34 28 64 62 2c 20 73 49 6e 66 6f 2e 7a 44  at4(db, sInfo.zD
d740: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 64 62  atabase);.    db
d750: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
d760: 62 6c 65 64 20 3d 20 6c 6f 6f 6b 61 73 69 64 65  bled = lookaside
d770: 45 6e 61 62 6c 65 64 3b 0a 20 20 7d 0a 23 65 6e  Enabled;.  }.#en
d780: 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
d790: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
d7a0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
d7b0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
d7c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65  eturn rc;.}...#e
d7d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d7e0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a     MIT_ANALYZE */.