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

Artifact a3f4ea45cdb4e9df78d4ea7beb87ec8a7a46f494173b641cd28512a40a97bff2:


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 74 68 72 6f 75 67  ons 3.7.9 throug
0550: 68 20 33 2e 32 39 2e 30 20 77 68 65 6e 0a 2a 2a  h 3.29.0 when.**
0560: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0570: 54 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54  TAT3 defined.  T
0580: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  he functionality
0590: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
05a0: 0a 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65  .** is a superse
05b0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  t of sqlite_stat
05c0: 32 20 61 6e 64 20 69 73 20 61 6c 73 6f 20 6e 6f  2 and is also no
05d0: 77 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  w deprecated.  T
05e0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  he.** sqlite_sta
05f0: 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63 65  t4 is an enhance
0600: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
0610: 69 74 65 5f 73 74 61 74 33 20 61 6e 64 20 69 73  ite_stat3 and is
0620: 20 6f 6e 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61   only .** availa
0630: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0640: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e  d with SQLITE_EN
0650: 41 42 4c 45 5f 53 54 41 54 34 20 61 6e 64 20 69  ABLE_STAT4 and i
0660: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 76 65 72 73  n SQLite.** vers
0670: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0680: 61 74 65 72 2e 20 20 53 54 41 54 34 20 69 73 20  ater.  STAT4 is 
0690: 74 68 65 20 6f 6e 6c 79 20 76 61 72 69 61 6e 74  the only variant
06a0: 20 74 68 61 74 20 69 73 20 73 74 69 6c 6c 0a 2a   that is still.*
06b0: 2a 20 73 75 70 70 6f 72 74 65 64 2e 0a 2a 2a 0a  * supported..**.
06c0: 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 70 70 6c  ** For most appl
06d0: 69 63 61 74 69 6f 6e 73 2c 20 73 71 6c 69 74 65  ications, sqlite
06e0: 5f 73 74 61 74 31 20 70 72 6f 76 69 64 65 73 20  _stat1 provides 
06f0: 61 6c 6c 20 74 68 65 20 73 74 61 74 69 73 74 69  all the statisti
0700: 63 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 66  cs required.** f
0710: 6f 72 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  or the query pla
0720: 6e 6e 65 72 20 74 6f 20 6d 61 6b 65 20 67 6f 6f  nner to make goo
0730: 64 20 63 68 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  d choices..**.**
0740: 20 46 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74   Format of sqlit
0750: 65 5f 73 74 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54  e_stat1:.**.** T
0760: 68 65 72 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  here is normally
0770: 20 6f 6e 65 20 72 6f 77 20 70 65 72 20 69 6e 64   one row per ind
0780: 65 78 2c 20 77 69 74 68 20 74 68 65 20 69 6e 64  ex, with the ind
0790: 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ex identified by
07a0: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20   the.** name in 
07b0: 74 68 65 20 69 64 78 20 63 6f 6c 75 6d 6e 2e 20  the idx column. 
07c0: 20 54 68 65 20 74 62 6c 20 63 6f 6c 75 6d 6e 20   The tbl column 
07d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 77  he table to.** w
07f0: 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62  hich the index b
0800: 65 6c 6f 6e 67 73 2e 20 20 49 6e 20 65 61 63 68  elongs.  In each
0810: 20 73 75 63 68 20 72 6f 77 2c 20 74 68 65 20 73   such row, the s
0820: 74 61 74 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20  tat column will 
0830: 62 65 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 63  be.** a string c
0840: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 6c  onsisting of a l
0850: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73 2e  ist of integers.
0860: 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65    The first inte
0870: 67 65 72 20 69 6e 20 74 68 69 73 0a 2a 2a 20 6c  ger in this.** l
0880: 69 73 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ist is the numbe
0890: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
08a0: 20 69 6e 64 65 78 2e 20 20 28 54 68 69 73 20 69   index.  (This i
08b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
08c0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
08d0: 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
08e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 70 61 72  , except for par
08f0: 74 69 61 6c 20 69 6e 64 69 63 65 73 2e 29 20 20  tial indices.)  
0900: 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e  The second.** in
0910: 74 65 67 65 72 20 69 73 20 74 68 65 20 61 76 65  teger is the ave
0920: 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  rage number of r
0930: 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
0940: 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73   that have the s
0950: 61 6d 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  ame.** value in 
0960: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
0970: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
0980: 54 68 65 20 74 68 69 72 64 20 69 6e 74 65 67 65  The third intege
0990: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
09a0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
09b0: 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ws in the index 
09c0: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
09d0: 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  me value for the
09e0: 20 66 69 72 73 74 20 74 77 6f 0a 2a 2a 20 63 6f   first two.** co
09f0: 6c 75 6d 6e 73 2e 20 20 54 68 65 20 4e 2d 74 68  lumns.  The N-th
0a00: 20 69 6e 74 65 67 65 72 20 28 66 6f 72 20 4e 3e   integer (for N>
0a10: 31 29 20 69 73 20 74 68 65 20 61 76 65 72 61 67  1) is the averag
0a20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0a30: 20 69 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65   in .** the inde
0a40: 78 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65  x which have the
0a50: 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20   same value for 
0a60: 74 68 65 20 66 69 72 73 74 20 4e 2d 31 20 63 6f  the first N-1 co
0a70: 6c 75 6d 6e 73 2e 20 20 46 6f 72 0a 2a 2a 20 61  lumns.  For.** a
0a80: 20 4b 2d 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c   K-column index,
0a90: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 4b   there will be K
0aa0: 2b 31 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74  +1 integers in t
0ab0: 68 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 2e 20  he stat column. 
0ac0: 20 49 66 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78   If.** the index
0ad0: 20 69 73 20 75 6e 69 71 75 65 2c 20 74 68 65 6e   is unique, then
0ae0: 20 74 68 65 20 6c 61 73 74 20 69 6e 74 65 67 65   the last intege
0af0: 72 20 77 69 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a  r will be 1..**.
0b00: 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69  ** The list of i
0b10: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0b20: 74 61 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f  tat column can o
0b30: 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 66 6f 6c  ptionally be fol
0b40: 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  lowed.** by the 
0b50: 6b 65 79 77 6f 72 64 20 22 75 6e 6f 72 64 65 72  keyword "unorder
0b60: 65 64 22 2e 20 20 54 68 65 20 22 75 6e 6f 72 64  ed".  The "unord
0b70: 65 72 65 64 22 20 6b 65 79 77 6f 72 64 2c 20 69  ered" keyword, i
0b80: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c  f it is present,
0b90: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 65 70 61  .** must be sepa
0ba0: 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6c  rated from the l
0bb0: 61 73 74 20 69 6e 74 65 67 65 72 20 62 79 20 61  ast integer by a
0bc0: 20 73 69 6e 67 6c 65 20 73 70 61 63 65 2e 20 20   single space.  
0bd0: 49 66 20 74 68 65 0a 2a 2a 20 22 75 6e 6f 72 64  If the.** "unord
0be0: 65 72 65 64 22 20 6b 65 79 77 6f 72 64 20 69 73  ered" keyword is
0bf0: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
0c00: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0c10: 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
0c20: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   the index is un
0c30: 6f 72 64 65 72 65 64 20 61 6e 64 20 77 69 6c 6c  ordered and will
0c40: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 69 6e 64   not use the ind
0c50: 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 71  ex for a range q
0c60: 75 65 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  uery..** .** If 
0c70: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
0c80: 2e 69 64 78 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  .idx column is N
0c90: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 73 71  ULL, then the sq
0ca0: 6c 69 74 65 5f 73 74 61 74 31 2e 73 74 61 74 0a  lite_stat1.stat.
0cb0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  ** column contai
0cc0: 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  ns a single inte
0cd0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
0ce0: 20 28 65 73 74 69 6d 61 74 65 64 29 20 6e 75 6d   (estimated) num
0cf0: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 69  ber of.** rows i
0d00: 6e 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  n the table iden
0d10: 74 69 66 69 65 64 20 62 79 20 73 71 6c 69 74 65  tified by sqlite
0d20: 5f 73 74 61 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a  _stat1.tbl..**.*
0d30: 2a 20 46 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69  * Format of sqli
0d40: 74 65 5f 73 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20  te_stat2:.**.** 
0d50: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
0d60: 20 69 73 20 6f 6e 6c 79 20 63 72 65 61 74 65 64   is only created
0d70: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 75 73 65   and is only use
0d80: 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  d if SQLite is c
0d90: 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
0da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0db0: 41 54 32 20 61 6e 64 20 69 66 20 74 68 65 20 53  AT2 and if the S
0dc0: 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
0dd0: 6d 62 65 72 20 69 73 20 62 65 74 77 65 65 6e 0a  mber is between.
0de0: 2a 2a 20 33 2e 36 2e 31 38 20 61 6e 64 20 33 2e  ** 3.6.18 and 3.
0df0: 37 2e 38 2e 20 20 54 68 65 20 22 73 74 61 74 32  7.8.  The "stat2
0e00: 22 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  " table contains
0e10: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
0e20: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74  rmation.** about
0e30: 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f   the distributio
0e40: 6e 20 6f 66 20 6b 65 79 73 20 77 69 74 68 69 6e  n of keys within
0e50: 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20   an index.  The 
0e60: 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 66  index is identif
0e70: 69 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 22 69  ied by.** the "i
0e80: 64 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74  dx" column and t
0e90: 68 65 20 22 74 62 6c 22 20 63 6f 6c 75 6d 6e 20  he "tbl" column 
0ea0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
0eb0: 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
0ec0: 68 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62  h.** the index b
0ed0: 65 6c 6f 6e 67 73 2e 20 20 54 68 65 72 65 20 61  elongs.  There a
0ee0: 72 65 20 75 73 75 61 6c 6c 79 20 31 30 20 72 6f  re usually 10 ro
0ef0: 77 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ws in the sqlite
0f00: 5f 73 74 61 74 32 0a 2a 2a 20 74 61 62 6c 65 20  _stat2.** table 
0f10: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2e 0a  for each index..
0f20: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
0f30: 5f 73 74 61 74 32 20 65 6e 74 72 69 65 73 20 66  _stat2 entries f
0f40: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
0f50: 20 68 61 76 65 20 73 61 6d 70 6c 65 6e 6f 20 62   have sampleno b
0f60: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 39 0a 2a  etween 0 and 9.*
0f70: 2a 20 69 6e 63 6c 75 73 69 76 65 20 61 72 65 20  * inclusive are 
0f80: 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 6c  samples of the l
0f90: 65 66 74 2d 6d 6f 73 74 20 6b 65 79 20 76 61 6c  eft-most key val
0fa0: 75 65 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ue in the index 
0fb0: 74 61 6b 65 6e 20 61 74 0a 2a 2a 20 65 76 65 6e  taken at.** even
0fc0: 6c 79 20 73 70 61 63 65 64 20 70 6f 69 6e 74 73  ly spaced points
0fd0: 20 61 6c 6f 6e 67 20 74 68 65 20 69 6e 64 65 78   along the index
0fe0: 2e 20 20 4c 65 74 20 74 68 65 20 6e 75 6d 62 65  .  Let the numbe
0ff0: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 62 65 20  r of samples be 
1000: 53 0a 2a 2a 20 28 31 30 20 69 6e 20 74 68 65 20  S.** (10 in the 
1010: 73 74 61 6e 64 61 72 64 20 62 75 69 6c 64 29 20  standard build) 
1020: 61 6e 64 20 6c 65 74 20 43 20 62 65 20 74 68 65  and let C be the
1030: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1040: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1050: 20 54 68 65 6e 20 74 68 65 20 73 61 6d 70 6c 65   Then the sample
1060: 64 20 72 6f 77 73 20 61 72 65 20 67 69 76 65 6e  d rows are given
1070: 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72   by:.**.**     r
1080: 6f 77 6e 75 6d 62 65 72 20 3d 20 28 69 2a 43 2a  ownumber = (i*C*
1090: 32 20 2b 20 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a  2 + C)/(S*2).**.
10a0: 2a 2a 20 46 6f 72 20 69 20 62 65 74 77 65 65 6e  ** For i between
10b0: 20 30 20 61 6e 64 20 53 2d 31 2e 20 20 43 6f 6e   0 and S-1.  Con
10c0: 63 65 70 74 75 61 6c 6c 79 2c 20 74 68 65 20 69  ceptually, the i
10d0: 6e 64 65 78 20 73 70 61 63 65 20 69 73 20 64 69  ndex space is di
10e0: 76 69 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 53 20  vided into.** S 
10f0: 75 6e 69 66 6f 72 6d 20 62 75 63 6b 65 74 73 20  uniform buckets 
1100: 61 6e 64 20 74 68 65 20 73 61 6d 70 6c 65 73 20  and the samples 
1110: 61 72 65 20 74 68 65 20 6d 69 64 64 6c 65 20 72  are the middle r
1120: 6f 77 20 66 72 6f 6d 20 65 61 63 68 20 62 75 63  ow from each buc
1130: 6b 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ket..**.** The f
1140: 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65  ormat for sqlite
1150: 5f 73 74 61 74 32 20 69 73 20 72 65 63 6f 72 64  _stat2 is record
1160: 65 64 20 68 65 72 65 20 66 6f 72 20 6c 65 67 61  ed here for lega
1170: 63 79 20 72 65 66 65 72 65 6e 63 65 2e 20 20 54  cy reference.  T
1180: 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  his.** version o
1190: 66 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  f SQLite does no
11a0: 74 20 73 75 70 70 6f 72 74 20 73 71 6c 69 74 65  t support sqlite
11b0: 5f 73 74 61 74 32 2e 20 20 49 74 20 6e 65 69 74  _stat2.  It neit
11c0: 68 65 72 20 72 65 61 64 73 20 6e 6f 72 0a 2a 2a  her reads nor.**
11d0: 20 77 72 69 74 65 73 20 74 68 65 20 73 71 6c 69   writes the sqli
11e0: 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 2e 20  te_stat2 table. 
11f0: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
1200: 20 53 51 4c 69 74 65 20 6f 6e 6c 79 20 73 75 70   SQLite only sup
1210: 70 6f 72 74 73 0a 2a 2a 20 73 71 6c 69 74 65 5f  ports.** sqlite_
1220: 73 74 61 74 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stat3..**.** For
1230: 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73  mat for sqlite_s
1240: 74 61 74 33 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat3:.**.** The 
1250: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 66 6f 72  sqlite_stat3 for
1260: 6d 61 74 20 69 73 20 61 20 73 75 62 73 65 74 20  mat is a subset 
1270: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 2e  of sqlite_stat4.
1280: 20 20 48 65 6e 63 65 2c 20 74 68 65 0a 2a 2a 20    Hence, the.** 
1290: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 66 6f 72  sqlite_stat4 for
12a0: 6d 61 74 20 77 69 6c 6c 20 62 65 20 64 65 73 63  mat will be desc
12b0: 72 69 62 65 64 20 66 69 72 73 74 2e 20 20 46 75  ribed first.  Fu
12c0: 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
12d0: 6e 0a 2a 2a 20 61 62 6f 75 74 20 73 71 6c 69 74  n.** about sqlit
12e0: 65 5f 73 74 61 74 33 20 66 6f 6c 6c 6f 77 73 20  e_stat3 follows 
12f0: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
1300: 20 64 65 73 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a   description..**
1310: 0a 2a 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 73  .** Format for s
1320: 71 6c 69 74 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a  qlite_stat4:.**.
1330: 2a 2a 20 41 73 20 77 69 74 68 20 73 71 6c 69 74  ** As with sqlit
1340: 65 5f 73 74 61 74 32 2c 20 74 68 65 20 73 71 6c  e_stat2, the sql
1350: 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20  ite_stat4 table 
1360: 63 6f 6e 74 61 69 6e 73 20 68 69 73 74 6f 67 72  contains histogr
1370: 61 6d 20 64 61 74 61 0a 2a 2a 20 74 6f 20 61 69  am data.** to ai
1380: 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  d the query plan
1390: 6e 65 72 20 69 6e 20 63 68 6f 6f 73 69 6e 67 20  ner in choosing 
13a0: 67 6f 6f 64 20 69 6e 64 69 63 65 73 20 62 61 73  good indices bas
13b0: 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 73  ed on the values
13c0: 0a 2a 2a 20 74 68 61 74 20 69 6e 64 65 78 65 64  .** that indexed
13d0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6d   columns are com
13e0: 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 69 6e  pared against in
13f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1400: 65 73 20 6f 66 0a 2a 2a 20 71 75 65 72 69 65 73  es of.** queries
1410: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
1420: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20 63  te_stat4 table c
1430: 6f 6e 74 61 69 6e 73 20 6d 75 6c 74 69 70 6c 65  ontains multiple
1440: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
1450: 68 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20  h index..** The 
1460: 69 64 78 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  idx column names
1470: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
1480: 68 65 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73  he tbl column is
1490: 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
14a0: 65 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 49 66 20  e.** index.  If 
14b0: 74 68 65 20 69 64 78 20 61 6e 64 20 74 62 6c 20  the idx and tbl 
14c0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 74 68 65 20  columns are the 
14d0: 73 61 6d 65 2c 20 74 68 65 6e 20 74 68 65 20 73  same, then the s
14e0: 61 6d 70 6c 65 20 69 73 0a 2a 2a 20 6f 66 20 74  ample is.** of t
14f0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
1500: 52 59 20 4b 45 59 2e 20 20 54 68 65 20 73 61 6d  RY KEY.  The sam
1510: 70 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20  ple column is a 
1520: 62 6c 6f 62 20 77 68 69 63 68 20 69 73 20 74 68  blob which is th
1530: 65 0a 2a 2a 20 62 69 6e 61 72 79 20 65 6e 63 6f  e.** binary enco
1540: 64 69 6e 67 20 6f 66 20 61 20 6b 65 79 20 66 72  ding of a key fr
1550: 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54  om the index.  T
1560: 68 65 20 6e 45 71 20 63 6f 6c 75 6d 6e 20 69 73  he nEq column is
1570: 20 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 69 6e   a.** list of in
1580: 74 65 67 65 72 73 2e 20 20 54 68 65 20 66 69 72  tegers.  The fir
1590: 73 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 68  st integer is th
15a0: 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75  e approximate nu
15b0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 6e 74 72 69  mber.** of entri
15c0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
15d0: 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
15e0: 63 6f 6c 75 6d 6e 20 65 78 61 63 74 6c 79 20 6d  column exactly m
15f0: 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 65  atches.** the le
1600: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
1610: 66 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54  f the sample.  T
1620: 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
1630: 72 20 69 6e 20 6e 45 71 0a 2a 2a 20 69 73 20 74  r in nEq.** is t
1640: 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e  he approximate n
1650: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1660: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68   in the index wh
1670: 65 72 65 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ere the.** first
1680: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 6d 61 74   two columns mat
1690: 63 68 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ch the first two
16a0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
16b0: 73 61 6d 70 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73  sample..** And s
16c0: 6f 20 66 6f 72 74 68 2e 20 20 6e 4c 74 20 69 73  o forth.  nLt is
16d0: 20 61 6e 6f 74 68 65 72 20 6c 69 73 74 20 6f 66   another list of
16e0: 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 73   integers that s
16f0: 68 6f 77 20 74 68 65 20 61 70 70 72 6f 78 69 6d  how the approxim
1700: 61 74 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  ate.** number of
1710: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 61 72   entries that ar
1720: 65 20 73 74 72 69 63 74 6c 79 20 6c 65 73 73 20  e strictly less 
1730: 74 68 61 6e 20 74 68 65 20 73 61 6d 70 6c 65 2e  than the sample.
1740: 20 20 54 68 65 20 66 69 72 73 74 0a 2a 2a 20 69    The first.** i
1750: 6e 74 65 67 65 72 20 69 6e 20 6e 4c 74 20 63 6f  nteger in nLt co
1760: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1770: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1780: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
1790: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
17a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20   column is less 
17b0: 74 68 61 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  than the left-mo
17c0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
17d0: 20 73 61 6d 70 6c 65 2e 0a 2a 2a 20 54 68 65 20   sample..** The 
17e0: 4b 2d 74 68 20 69 6e 74 65 67 65 72 20 69 6e 20  K-th integer in 
17f0: 74 68 65 20 6e 4c 74 20 65 6e 74 72 79 20 69 73  the nLt entry is
1800: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
1810: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 0a 2a 2a  ndex entries .**
1820: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1830: 20 4b 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6c   K columns are l
1840: 65 73 73 20 74 68 61 6e 20 74 68 65 20 66 69 72  ess than the fir
1850: 73 74 20 4b 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  st K columns of 
1860: 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 20  the.** sample.  
1870: 54 68 65 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20  The nDLt column 
1880: 69 73 20 6c 69 6b 65 20 6e 4c 74 20 65 78 63 65  is like nLt exce
1890: 70 74 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61  pt that it conta
18a0: 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
18b0: 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65  er of distinct e
18c0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e  ntries in the in
18d0: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
18e0: 73 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 73 61  s than the.** sa
18f0: 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  mple..**.** Ther
1900: 65 20 63 61 6e 20 62 65 20 61 6e 20 61 72 62 69  e can be an arbi
1910: 74 72 61 72 79 20 6e 75 6d 62 65 72 20 6f 66 20  trary number of 
1920: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 65 6e 74  sqlite_stat4 ent
1930: 72 69 65 73 20 70 65 72 20 69 6e 64 65 78 2e 0a  ries per index..
1940: 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63  ** The ANALYZE c
1950: 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20 74 79 70 69  ommand will typi
1960: 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 20 73  cally generate s
1970: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
1980: 65 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  es.** that conta
1990: 69 6e 20 62 65 74 77 65 65 6e 20 31 30 20 61 6e  in between 10 an
19a0: 64 20 34 30 20 73 61 6d 70 6c 65 73 20 77 68 69  d 40 samples whi
19b0: 63 68 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ch are distribut
19c0: 65 64 20 61 63 72 6f 73 73 0a 2a 2a 20 74 68 65  ed across.** the
19d0: 20 6b 65 79 20 73 70 61 63 65 2c 20 74 68 6f 75   key space, thou
19e0: 67 68 20 6e 6f 74 20 75 6e 69 66 6f 72 6d 6c 79  gh not uniformly
19f0: 2c 20 61 6e 64 20 77 68 69 63 68 20 69 6e 63 6c  , and which incl
1a00: 75 64 65 20 73 61 6d 70 6c 65 73 20 77 69 74 68  ude samples with
1a10: 0a 2a 2a 20 6c 61 72 67 65 20 6e 45 71 20 76 61  .** large nEq va
1a20: 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d  lues..**.** Form
1a30: 61 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74  at for sqlite_st
1a40: 61 74 33 20 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a  at3 redux:.**.**
1a50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
1a60: 33 20 74 61 62 6c 65 20 69 73 20 6c 69 6b 65 20  3 table is like 
1a70: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 65 78 63  sqlite_stat4 exc
1a80: 65 70 74 20 74 68 61 74 20 69 74 20 6f 6e 6c 79  ept that it only
1a90: 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
1aa0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1ab0: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1ac0: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
1ad0: 33 2e 73 61 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75  3.sample.** colu
1ae0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  mn contains the 
1af0: 61 63 74 75 61 6c 20 76 61 6c 75 65 20 6f 66 20  actual value of 
1b00: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  the left-most co
1b10: 6c 75 6d 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  lumn instead.** 
1b20: 6f 66 20 61 20 62 6c 6f 62 20 65 6e 63 6f 64 69  of a blob encodi
1b30: 6e 67 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 65  ng of the comple
1b40: 74 65 20 69 6e 64 65 78 20 6b 65 79 20 61 73 20  te index key as 
1b50: 69 73 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73  is found in.** s
1b60: 71 6c 69 74 65 5f 73 74 61 74 34 2e 73 61 6d 70  qlite_stat4.samp
1b70: 6c 65 2e 20 20 54 68 65 20 6e 45 71 2c 20 6e 4c  le.  The nEq, nL
1b80: 74 2c 20 61 6e 64 20 6e 44 4c 74 20 65 6e 74 72  t, and nDLt entr
1b90: 69 65 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  ies of sqlite_st
1ba0: 61 74 33 0a 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61  at3.** all conta
1bb0: 69 6e 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  in just a single
1bc0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1bd0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
1be0: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1bf0: 65 72 20 69 6e 20 74 68 65 20 65 71 75 69 76 61  er in the equiva
1c00: 6c 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  lent columns in 
1c10: 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 0a 2a 2f  sqlite_stat4..*/
1c20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c30: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e  OMIT_ANALYZE.#in
1c40: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
1c50: 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h"..#if defined
1c60: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
1c70: 54 41 54 34 29 0a 23 20 64 65 66 69 6e 65 20 49  TAT4).# define I
1c80: 73 53 74 61 74 34 20 20 20 20 20 31 0a 23 65 6c  sStat4     1.#el
1c90: 73 65 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  se.# define IsSt
1ca0: 61 74 34 20 20 20 20 20 30 0a 23 20 75 6e 64 65  at4     0.# unde
1cb0: 66 20 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53  f SQLITE_STAT4_S
1cc0: 41 4d 50 4c 45 53 0a 23 20 64 65 66 69 6e 65 20  AMPLES.# define 
1cd0: 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d  SQLITE_STAT4_SAM
1ce0: 50 4c 45 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  PLES 1.#endif../
1cf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d00: 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
1d10: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
1d20: 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
1d30: 6c 65 73 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69  les..** The sqli
1d40: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69  te_stat1 table i
1d50: 73 20 61 6c 77 61 79 73 20 72 65 6c 65 76 61 6e  s always relevan
1d60: 74 2e 20 20 73 71 6c 69 74 65 5f 73 74 61 74 32  t.  sqlite_stat2
1d70: 20 69 73 20 6e 6f 77 0a 2a 2a 20 6f 62 73 6f 6c   is now.** obsol
1d80: 65 74 65 2e 20 20 73 71 6c 69 74 65 5f 73 74 61  ete.  sqlite_sta
1d90: 74 33 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  t3 and sqlite_st
1da0: 61 74 34 20 61 72 65 20 6f 6e 6c 79 20 6f 70 65  at4 are only ope
1db0: 6e 65 64 20 77 68 65 6e 0a 2a 2a 20 61 70 70 72  ned when.** appr
1dc0: 6f 70 72 69 61 74 65 20 63 6f 6d 70 69 6c 65 2d  opriate compile-
1dd0: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  time options are
1de0: 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 0a 2a 2a   provided..**.**
1df0: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   If the sqlite_s
1e00: 74 61 74 4e 20 74 61 62 6c 65 73 20 64 6f 20 6e  tatN tables do n
1e10: 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ot previously ex
1e20: 69 73 74 2c 20 69 74 20 69 73 20 63 72 65 61 74  ist, it is creat
1e30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  ed..**.** Argume
1e40: 6e 74 20 7a 57 68 65 72 65 20 6d 61 79 20 62 65  nt zWhere may be
1e50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1e60: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1e70: 67 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  g a table name,.
1e80: 2a 2a 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  ** or it may be 
1e90: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20  a NULL pointer. 
1ea0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
1eb0: 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 65 6e 74 72  L, then all entr
1ec0: 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  ies in.** the sq
1ed0: 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
1ee0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1ef0: 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1f00: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  e are deleted..*
1f10: 2a 20 49 66 20 7a 57 68 65 72 65 3d 3d 30 2c 20  * If zWhere==0, 
1f20: 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1f30: 65 72 61 74 65 64 20 74 6f 20 64 65 6c 65 74 65  erated to delete
1f40: 20 61 6c 6c 20 73 74 61 74 20 74 61 62 6c 65 20   all stat table 
1f50: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
1f60: 69 63 20 76 6f 69 64 20 6f 70 65 6e 53 74 61 74  ic void openStat
1f70: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
1f80: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1f90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1fa0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
1fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fc0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1fd0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1fe0: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  in */.  int iSta
1ff0: 74 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  tCur,           
2000: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  /* Open the sqli
2010: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 6f  te_stat1 table o
2020: 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  n this cursor */
2030: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2040: 57 68 65 72 65 2c 20 20 20 20 20 2f 2a 20 44 65  Where,     /* De
2050: 6c 65 74 65 20 65 6e 74 72 69 65 73 20 66 6f 72  lete entries for
2060: 20 74 68 69 73 20 74 61 62 6c 65 20 6f 72 20 69   this table or i
2070: 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
2080: 63 68 61 72 20 2a 7a 57 68 65 72 65 54 79 70 65  char *zWhereType
2090: 20 20 2f 2a 20 45 69 74 68 65 72 20 22 74 62 6c    /* Either "tbl
20a0: 22 20 6f 72 20 22 69 64 78 22 20 2a 2f 0a 29 7b  " or "idx" */.){
20b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
20c0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
20d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
20e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20f0: 7a 43 6f 6c 73 3b 0a 20 20 7d 20 61 54 61 62 6c  zCols;.  } aTabl
2100: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 73  e[] = {.    { "s
2110: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 22 74  qlite_stat1", "t
2120: 62 6c 2c 69 64 78 2c 73 74 61 74 22 20 7d 2c 0a  bl,idx,stat" },.
2130: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2140: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
2150: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73  .    { "sqlite_s
2160: 74 61 74 34 22 2c 20 22 74 62 6c 2c 69 64 78 2c  tat4", "tbl,idx,
2170: 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d  neq,nlt,ndlt,sam
2180: 70 6c 65 22 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  ple" },.#else.  
2190: 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74 61 74    { "sqlite_stat
21a0: 34 22 2c 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a  4", 0 },.#endif.
21b0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
21c0: 61 74 33 22 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a  at3", 0 },.  };.
21d0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
21e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21f0: 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  >db;.  Db *pDb;.
2200: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
2210: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2220: 65 29 3b 0a 20 20 69 6e 74 20 61 52 6f 6f 74 5b  e);.  int aRoot[
2230: 41 72 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65  ArraySize(aTable
2240: 29 5d 3b 0a 20 20 75 38 20 61 43 72 65 61 74 65  )];.  u8 aCreate
2250: 54 62 6c 5b 41 72 72 61 79 53 69 7a 65 28 61 54  Tbl[ArraySize(aT
2260: 61 62 6c 65 29 5d 3b 0a 0a 20 20 69 66 28 20 76  able)];..  if( v
2270: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2280: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2290: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
22a0: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61 73 73  xes(db) );.  ass
22b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
22c0: 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a 20 20 70  Db(v)==db );.  p
22d0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
22e0: 62 5d 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  b];..  /* Create
22f0: 20 6e 65 77 20 73 74 61 74 69 73 74 69 63 20 74   new statistic t
2300: 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 64 6f  ables if they do
2310: 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 63   not exist, or c
2320: 6c 65 61 72 20 74 68 65 6d 0a 20 20 2a 2a 20 69  lear them.  ** i
2330: 66 20 74 68 65 79 20 64 6f 20 61 6c 72 65 61 64  f they do alread
2340: 79 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  y exist..  */.  
2350: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
2360: 53 69 7a 65 28 61 54 61 62 6c 65 29 3b 20 69 2b  Size(aTable); i+
2370: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
2380: 61 72 20 2a 7a 54 61 62 20 3d 20 61 54 61 62 6c  ar *zTab = aTabl
2390: 65 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  e[i].zName;.    
23a0: 54 61 62 6c 65 20 2a 70 53 74 61 74 3b 0a 20 20  Table *pStat;.  
23b0: 20 20 69 66 28 20 28 70 53 74 61 74 20 3d 20 73    if( (pStat = s
23c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
23d0: 64 62 2c 20 7a 54 61 62 2c 20 70 44 62 2d 3e 7a  db, zTab, pDb->z
23e0: 44 62 53 4e 61 6d 65 29 29 3d 3d 30 20 29 7b 0a  DbSName))==0 ){.
23f0: 20 20 20 20 20 20 69 66 28 20 61 54 61 62 6c 65        if( aTable
2400: 5b 69 5d 2e 7a 43 6f 6c 73 20 29 7b 0a 20 20 20  [i].zCols ){.   
2410: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69       /* The sqli
2420: 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 20 64  te_statN table d
2430: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 43  oes not exist. C
2440: 72 65 61 74 65 20 69 74 2e 20 4e 6f 74 65 20 74  reate it. Note t
2450: 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 2a  hat a .        *
2460: 2a 20 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66  * side-effect of
2470: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
2480: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  E statement is t
2490: 6f 20 6c 65 61 76 65 20 74 68 65 20 72 6f 6f 74  o leave the root
24a0: 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
24b0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
24c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  e in register pP
24d0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 20 54  arse->regRoot. T
24e0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
24f0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63   .        ** bec
2500: 61 75 73 65 20 74 68 65 20 4f 70 65 6e 57 72 69  ause the OpenWri
2510: 74 65 20 6f 70 63 6f 64 65 20 62 65 6c 6f 77 20  te opcode below 
2520: 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 20  will be needing 
2530: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  it. */.        s
2540: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
2550: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
2560: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
2570: 42 4c 45 20 25 51 2e 25 73 28 25 73 29 22 2c 20  BLE %Q.%s(%s)", 
2580: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2590: 54 61 62 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  Tab, aTable[i].z
25a0: 43 6f 6c 73 0a 20 20 20 20 20 20 20 20 29 3b 0a  Cols.        );.
25b0: 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 69 5d          aRoot[i]
25c0: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
25d0: 6f 74 3b 0a 20 20 20 20 20 20 20 20 61 43 72 65  ot;.        aCre
25e0: 61 74 65 54 62 6c 5b 69 5d 20 3d 20 4f 50 46 4c  ateTbl[i] = OPFL
25f0: 41 47 5f 50 32 49 53 52 45 47 3b 0a 20 20 20 20  AG_P2ISREG;.    
2600: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2610: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2620: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
2630: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 6e  . If zWhere is n
2640: 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20  ot NULL, delete 
2650: 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a 20 20 20  all entries .   
2660: 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64     ** associated
2670: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
2680: 7a 57 68 65 72 65 2e 20 49 66 20 7a 57 68 65 72  zWhere. If zWher
2690: 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65 6c 65 74  e is NULL, delet
26a0: 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  e the.      ** e
26b0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
26c0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 2a 2f 0a  f the table. */.
26d0: 20 20 20 20 20 20 61 52 6f 6f 74 5b 69 5d 20 3d        aRoot[i] =
26e0: 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pStat->tnum;.  
26f0: 20 20 20 20 61 43 72 65 61 74 65 54 62 6c 5b 69      aCreateTbl[i
2700: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
2710: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2720: 61 72 73 65 2c 20 69 44 62 2c 20 61 52 6f 6f 74  arse, iDb, aRoot
2730: 5b 69 5d 2c 20 31 2c 20 7a 54 61 62 29 3b 0a 20  [i], 1, zTab);. 
2740: 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 20       if( zWhere 
2750: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2760: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
2770: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
2780: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2790: 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
27a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 62  ,.           pDb
27b0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62  ->zDbSName, zTab
27c0: 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20 7a 57  , zWhereType, zW
27d0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  here.        );.
27e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27f0: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
2800: 4f 4f 4b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  OOK.      }else 
2810: 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61  if( db->xPreUpda
2820: 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  teCallback ){.  
2830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
2840: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
2850: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2860: 2e 25 73 22 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  .%s", pDb->zDbSN
2870: 61 6d 65 2c 20 7a 54 61 62 29 3b 0a 23 65 6e 64  ame, zTab);.#end
2880: 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
2890: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
28a0: 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20  qlite_stat[134] 
28b0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
28c0: 69 73 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c  ists.  Delete al
28d0: 6c 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  l rows. */.     
28e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
2900: 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29  , aRoot[i], iDb)
2910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2920: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
2930: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  he sqlite_stat[1
2940: 33 34 5d 20 74 61 62 6c 65 73 20 66 6f 72 20 77  34] tables for w
2950: 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72  riting. */.  for
2960: 28 69 3d 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e  (i=0; aTable[i].
2970: 7a 43 6f 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  zCols; i++){.   
2980: 20 61 73 73 65 72 74 28 20 69 3c 41 72 72 61 79   assert( i<Array
2990: 53 69 7a 65 28 61 54 61 62 6c 65 29 20 29 3b 0a  Size(aTable) );.
29a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29b0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
29c0: 70 65 6e 57 72 69 74 65 2c 20 69 53 74 61 74 43  penWrite, iStatC
29d0: 75 72 2b 69 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  ur+i, aRoot[i], 
29e0: 69 44 62 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c  iDb, 3);.    sql
29f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2a00: 28 76 2c 20 61 43 72 65 61 74 65 54 62 6c 5b 69  (v, aCreateTbl[i
2a10: 5d 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  ]);.    VdbeComm
2a20: 65 6e 74 28 28 76 2c 20 61 54 61 62 6c 65 5b 69  ent((v, aTable[i
2a30: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d  ].zName));.  }.}
2a40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e  ../*.** Recommen
2a50: 64 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  ded number of sa
2a60: 6d 70 6c 65 73 20 66 6f 72 20 73 71 6c 69 74 65  mples for sqlite
2a70: 5f 73 74 61 74 34 0a 2a 2f 0a 23 69 66 6e 64 65  _stat4.*/.#ifnde
2a80: 66 20 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53  f SQLITE_STAT4_S
2a90: 41 4d 50 4c 45 53 0a 23 20 64 65 66 69 6e 65 20  AMPLES.# define 
2aa0: 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d  SQLITE_STAT4_SAM
2ab0: 50 4c 45 53 20 32 34 0a 23 65 6e 64 69 66 0a 0a  PLES 24.#endif..
2ac0: 2f 2a 0a 2a 2a 20 54 68 72 65 65 20 53 51 4c 20  /*.** Three SQL 
2ad0: 66 75 6e 63 74 69 6f 6e 73 20 2d 20 73 74 61 74  functions - stat
2ae0: 5f 69 6e 69 74 28 29 2c 20 73 74 61 74 5f 70 75  _init(), stat_pu
2af0: 73 68 28 29 2c 20 61 6e 64 20 73 74 61 74 5f 67  sh(), and stat_g
2b00: 65 74 28 29 20 2d 0a 2a 2a 20 73 68 61 72 65 20  et() -.** share 
2b10: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2b20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2b30: 75 63 74 75 72 65 20 74 6f 20 68 6f 6c 64 20 74  ucture to hold t
2b40: 68 65 69 72 20 73 74 61 74 65 0a 2a 2a 20 69 6e  heir state.** in
2b50: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  formation..*/.ty
2b60: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2b70: 74 34 41 63 63 75 6d 20 53 74 61 74 34 41 63 63  t4Accum Stat4Acc
2b80: 75 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  um;.typedef stru
2b90: 63 74 20 53 74 61 74 34 53 61 6d 70 6c 65 20 53  ct Stat4Sample S
2ba0: 74 61 74 34 53 61 6d 70 6c 65 3b 0a 73 74 72 75  tat4Sample;.stru
2bb0: 63 74 20 53 74 61 74 34 53 61 6d 70 6c 65 20 7b  ct Stat4Sample {
2bc0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71  .  tRowcnt *anEq
2bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2be0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2bf0: 74 34 2e 6e 45 71 20 2a 2f 0a 20 20 74 52 6f 77  t4.nEq */.  tRow
2c00: 63 6e 74 20 2a 61 6e 44 4c 74 3b 20 20 20 20 20  cnt *anDLt;     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2c20: 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 44 4c 74  qlite_stat4.nDLt
2c30: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2c40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
2c50: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20   tRowcnt *anLt; 
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2c80: 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  .nLt */.  union 
2c90: 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cb0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
2cc0: 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20  n main table of 
2cd0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75  the key */.    u
2ce0: 38 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20  8 *aRowid;      
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d00: 2a 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55  * Key for WITHOU
2d10: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
2d20: 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e  /.  } u;.  u32 n
2d30: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d50: 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f  zeof aRowid[] */
2d60: 0a 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b  .  u8 isPSample;
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2d90: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20  periodic sample 
2da0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53       /* If !isPS
2dd0: 61 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f  ample, the reaso
2de0: 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20  n for inclusion 
2df0: 2a 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20  */.  u32 iHash; 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b       /* Tiebreak
2e20: 65 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69  er hash */.#endi
2e30: 66 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  f.};            
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20          .struct 
2e70: 53 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74  Stat4Accum {.  t
2e80: 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20  Rowcnt nRow;    
2e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ea0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2eb0: 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
2ec0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61  /.  tRowcnt nPSa
2ed0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  mple;         /*
2ee0: 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f   How often to do
2ef0: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2f00: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
2f10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2f30: 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20  olumns in index 
2f40: 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20  + pk/rowid */.  
2f50: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
2f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f70: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
2f80: 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20 70 6b 2f  umns w/o the pk/
2f90: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  rowid */.  int m
2fa0: 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  xSample;        
2fb0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2fc0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
2fd0: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
2fe0: 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  */.  Stat4Sample
2ff0: 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f   current;      /
3000: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73  * Current row as
3010: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a   a Stat4Sample *
3020: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3040: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
3050: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
3060: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61  ampling */.  Sta
3070: 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b  t4Sample *aBest;
3080: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3090: 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61 6d  of nCol best sam
30a0: 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ples */.  int iM
30b0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
30c0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
30d0: 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69 74  a[] of entry wit
30e0: 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65 20  h minimum score 
30f0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65  */.  int nSample
3100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3110: 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
3120: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20   of samples */. 
3130: 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65 72 6f 3b   int nMaxEqZero;
3140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3150: 78 20 6c 65 61 64 69 6e 67 20 30 20 69 6e 20 61  x leading 0 in a
3160: 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79 20 61 5b  nEq[] for any a[
3170: 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  ] entry */.  int
3180: 20 69 47 65 74 3b 20 20 20 20 20 20 20 20 20 20   iGet;          
3190: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
31a0: 6f 66 20 63 75 72 72 65 6e 74 20 73 61 6d 70 6c  of current sampl
31b0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 73 74  e accessed by st
31c0: 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20 20 53 74  at_get() */.  St
31d0: 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b 20 20 20  at4Sample *a;   
31e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
31f0: 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20 53 74 61   of mxSample Sta
3200: 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65 63 74 73  t4Sample objects
3210: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3220: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3230: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3240: 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d 61 6c 6c  ection, for mall
3250: 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  oc() */.};../* R
3260: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 75 73  eclaim memory us
3270: 65 64 20 62 79 20 61 20 53 74 61 74 34 53 61 6d  ed by a Stat4Sam
3280: 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ple.*/.#ifdef SQ
3290: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
32a0: 34 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61  4.static void sa
32b0: 6d 70 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65  mpleClear(sqlite
32c0: 33 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70  3 *db, Stat4Samp
32d0: 6c 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  le *p){.  assert
32e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
32f0: 20 70 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20   p->nRowid ){.  
3300: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3310: 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29  db, p->u.aRowid)
3320: 3b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20  ;.    p->nRowid 
3330: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
3340: 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  f../* Initialize
3350: 20 74 68 65 20 42 4c 4f 42 20 76 61 6c 75 65 20   the BLOB value 
3360: 6f 66 20 61 20 52 4f 57 49 44 0a 2a 2f 0a 23 69  of a ROWID.*/.#i
3370: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3380: 4c 45 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  LE_STAT4.static 
3390: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
33a0: 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
33b0: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 2c   Stat4Sample *p,
33c0: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 75 38   int n, const u8
33d0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 61 73 73 65   *pData){.  asse
33e0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
33f0: 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29 20 73  f( p->nRowid ) s
3400: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3410: 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20   p->u.aRowid);. 
3420: 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 3d 20 73   p->u.aRowid = s
3430: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
3440: 77 4e 4e 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66  wNN(db, n);.  if
3450: 28 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 29 7b  ( p->u.aRowid ){
3460: 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d  .    p->nRowid =
3470: 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   n;.    memcpy(p
3480: 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 44 61 74  ->u.aRowid, pDat
3490: 61 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a, n);.  }else{.
34a0: 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20      p->nRowid = 
34b0: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
34c0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ./* Initialize t
34d0: 68 65 20 49 4e 54 45 47 45 52 20 76 61 6c 75 65  he INTEGER value
34e0: 20 6f 66 20 61 20 52 4f 57 49 44 2e 0a 2a 2f 0a   of a ROWID..*/.
34f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3500: 41 42 4c 45 5f 53 54 41 54 34 0a 73 74 61 74 69  ABLE_STAT4.stati
3510: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74  c void sampleSet
3520: 52 6f 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74  RowidInt64(sqlit
3530: 65 33 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d  e3 *db, Stat4Sam
3540: 70 6c 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  ple *p, i64 iRow
3550: 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64  id){.  assert( d
3560: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  b!=0 );.  if( p-
3570: 3e 6e 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  >nRowid ) sqlite
3580: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
3590: 2e 61 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e  .aRowid);.  p->n
35a0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e  Rowid = 0;.  p->
35b0: 75 2e 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  u.iRowid = iRowi
35c0: 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d;.}.#endif.../*
35d0: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  .** Copy the con
35e0: 74 65 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20  tents of object 
35f0: 28 2a 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a  (*pFrom) into (*
3600: 70 54 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  pTo)..*/.#ifdef 
3610: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3620: 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AT4.static void 
3630: 73 61 6d 70 6c 65 43 6f 70 79 28 53 74 61 74 34  sampleCopy(Stat4
3640: 41 63 63 75 6d 20 2a 70 2c 20 53 74 61 74 34 53  Accum *p, Stat4S
3650: 61 6d 70 6c 65 20 2a 70 54 6f 2c 20 53 74 61 74  ample *pTo, Stat
3660: 34 53 61 6d 70 6c 65 20 2a 70 46 72 6f 6d 29 7b  4Sample *pFrom){
3670: 0a 20 20 70 54 6f 2d 3e 69 73 50 53 61 6d 70 6c  .  pTo->isPSampl
3680: 65 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 50 53 61  e = pFrom->isPSa
3690: 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d 3e 69 43 6f  mple;.  pTo->iCo
36a0: 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69 43 6f 6c 3b  l = pFrom->iCol;
36b0: 0a 20 20 70 54 6f 2d 3e 69 48 61 73 68 20 3d 20  .  pTo->iHash = 
36c0: 70 46 72 6f 6d 2d 3e 69 48 61 73 68 3b 0a 20 20  pFrom->iHash;.  
36d0: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 45 71  memcpy(pTo->anEq
36e0: 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45 71 2c 20 73  , pFrom->anEq, s
36f0: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70  izeof(tRowcnt)*p
3700: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70  ->nCol);.  memcp
3710: 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c 20 70 46 72  y(pTo->anLt, pFr
3720: 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69 7a 65 6f 66  om->anLt, sizeof
3730: 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f  (tRowcnt)*p->nCo
3740: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  l);.  memcpy(pTo
3750: 2d 3e 61 6e 44 4c 74 2c 20 70 46 72 6f 6d 2d 3e  ->anDLt, pFrom->
3760: 61 6e 44 4c 74 2c 20 73 69 7a 65 6f 66 28 74 52  anDLt, sizeof(tR
3770: 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b  owcnt)*p->nCol);
3780: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 6e 52  .  if( pFrom->nR
3790: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 61 6d 70  owid ){.    samp
37a0: 6c 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64 62  leSetRowid(p->db
37b0: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 52  , pTo, pFrom->nR
37c0: 6f 77 69 64 2c 20 70 46 72 6f 6d 2d 3e 75 2e 61  owid, pFrom->u.a
37d0: 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  Rowid);.  }else{
37e0: 0a 20 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f  .    sampleSetRo
37f0: 77 69 64 49 6e 74 36 34 28 70 2d 3e 64 62 2c 20  widInt64(p->db, 
3800: 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 75 2e 69 52  pTo, pFrom->u.iR
3810: 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  owid);.  }.}.#en
3820: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  dif../*.** Recla
3830: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6f 66  im all memory of
3840: 20 61 20 53 74 61 74 34 41 63 63 75 6d 20 73 74   a Stat4Accum st
3850: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3860: 69 63 20 76 6f 69 64 20 73 74 61 74 34 44 65 73  ic void stat4Des
3870: 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 4f  tructor(void *pO
3880: 6c 64 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75  ld){.  Stat4Accu
3890: 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63  m *p = (Stat4Acc
38a0: 75 6d 2a 29 70 4f 6c 64 3b 0a 23 69 66 64 65 66  um*)pOld;.#ifdef
38b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
38c0: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
38d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
38e0: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
38f0: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3900: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3910: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3920: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3930: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3940: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
3950: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
3960: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
3970: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3980: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
3990: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
39a0: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
39b0: 74 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e  t(N,K,C) SQL fun
39c0: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
39d0: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
39e0: 72 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20  re:.**     N:   
39f0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3a00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3a10: 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  dex including th
3a20: 65 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65  e rowid/pk (note
3a30: 20 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20   1).**     K:   
3a40: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3a50: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3a60: 64 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68  dex excluding th
3a70: 65 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20  e rowid/pk..**  
3a80: 20 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d     C:    The num
3a90: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
3aa0: 68 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32  he index (note 2
3ab0: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20  ).**.** Note 1: 
3ac0: 20 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20   In the special 
3ad0: 63 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65  case of the cove
3ae0: 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ring index that 
3af0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20  implements a.** 
3b00: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3b10: 62 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75  ble, N is the nu
3b20: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
3b30: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74  KEY columns, not
3b40: 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
3b50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3b60: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
3b70: 0a 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69  .** Note 2:  C i
3b80: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
3b90: 53 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  STAT4..**.** For
3ba0: 20 69 6e 64 65 78 65 73 20 6f 6e 20 6f 72 64 69   indexes on ordi
3bb0: 6e 61 72 79 20 72 6f 77 69 64 20 74 61 62 6c 65  nary rowid table
3bc0: 73 2c 20 4e 3d 3d 4b 2b 31 2e 20 20 42 75 74 20  s, N==K+1.  But 
3bd0: 66 6f 72 20 69 6e 64 65 78 65 73 20 6f 6e 0a 2a  for indexes on.*
3be0: 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
3bf0: 74 61 62 6c 65 73 2c 20 4e 3d 4b 2b 50 20 77 68  tables, N=K+P wh
3c00: 65 72 65 20 50 20 69 73 20 74 68 65 20 6e 75 6d  ere P is the num
3c10: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3c20: 6e 20 74 68 65 0a 2a 2a 20 50 52 49 4d 41 52 59  n the.** PRIMARY
3c30: 20 4b 45 59 20 6f 66 20 74 68 65 20 74 61 62 6c   KEY of the tabl
3c40: 65 2e 20 20 54 68 65 20 63 6f 76 65 72 69 6e 67  e.  The covering
3c50: 20 69 6e 64 65 78 20 74 68 61 74 20 69 6d 70 6c   index that impl
3c60: 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 6f 72  ements the.** or
3c70: 69 67 69 6e 61 6c 20 57 49 54 48 4f 55 54 20 52  iginal WITHOUT R
3c80: 4f 57 49 44 20 74 61 62 6c 65 20 61 73 20 4e 3d  OWID table as N=
3c90: 3d 4b 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  =K as a special 
3ca0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
3cb0: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
3cc0: 65 73 20 74 68 65 20 53 74 61 74 34 41 63 63 75  es the Stat4Accu
3cd0: 6d 20 6f 62 6a 65 63 74 20 69 6e 20 68 65 61 70  m object in heap
3ce0: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72 65 74   memory. The ret
3cf0: 75 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20 69 73  urn .** value is
3d00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3d10: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
3d20: 65 63 74 2e 20 20 54 68 65 20 64 61 74 61 74 79  ect.  The dataty
3d30: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 74  pe of the.** ret
3d40: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 42 4c 4f  urn value is BLO
3d50: 42 2c 20 62 75 74 20 69 74 20 69 73 20 72 65 61  B, but it is rea
3d60: 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69 6e 74  lly just a point
3d70: 65 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41  er to the Stat4A
3d80: 63 63 75 6d 0a 2a 2a 20 6f 62 6a 65 63 74 2e 0a  ccum.** object..
3d90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3da0: 74 61 74 49 6e 69 74 28 0a 20 20 73 71 6c 69 74  tatInit(.  sqlit
3db0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3dc0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
3dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3de0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61   **argv.){.  Sta
3df0: 74 34 41 63 63 75 6d 20 2a 70 3b 0a 20 20 69 6e  t4Accum *p;.  in
3e00: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
3e30: 6e 73 20 69 6e 20 69 6e 64 65 78 20 62 65 69 6e  ns in index bein
3e40: 67 20 73 61 6d 70 6c 65 64 20 2a 2f 0a 20 20 69  g sampled */.  i
3e50: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
3e80: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
3e90: 20 6e 43 6f 6c 55 70 3b 20 20 20 20 20 20 20 20   nColUp;        
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3eb0: 6e 43 6f 6c 20 72 6f 75 6e 64 65 64 20 75 70 20  nCol rounded up 
3ec0: 66 6f 72 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f  for alignment */
3ed0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
3f00: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
3f10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3f20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3f30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3f60: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 6e 74  ABLE_STAT4.  int
3f70: 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49   mxSample = SQLI
3f80: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
3f90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
3fa0: 65 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ecode the three 
3fb0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
3fc0: 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  ts */.  UNUSED_P
3fd0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
3fe0: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
3ff0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
4000: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0]);.  assert( n
4010: 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43 6f 6c 55  Col>0 );.  nColU
4020: 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63  p = sizeof(tRowc
4030: 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b 31 29  nt)<8 ? (nCol+1)
4040: 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20 20 6e 4b  &~1 : nCol;.  nK
4050: 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  eyCol = sqlite3_
4060: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
4070: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  ]);.  assert( nK
4080: 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29 3b 0a 20  eyCol<=nCol );. 
4090: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
40a0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  >0 );..  /* Allo
40b0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72  cate the space r
40c0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
40d0: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
40e0: 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f  t */.  n = sizeo
40f0: 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a  f(*p) .    + siz
4100: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4110: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
4120: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
4130: 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b  um.anEq */.    +
4140: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
4150: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
4160: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
4170: 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a  4Accum.anDLt */.
4180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4190: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 2b  ABLE_STAT4.    +
41a0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
41b0: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
41d0: 34 41 63 63 75 6d 2e 61 6e 4c 74 20 2a 2f 0a 20  4Accum.anLt */. 
41e0: 20 20 20 2b 20 73 69 7a 65 6f 66 28 53 74 61 74     + sizeof(Stat
41f0: 34 53 61 6d 70 6c 65 29 2a 28 6e 43 6f 6c 2b 6d  4Sample)*(nCol+m
4200: 78 53 61 6d 70 6c 65 29 20 20 20 20 20 2f 2a 20  xSample)     /* 
4210: 53 74 61 74 34 41 63 63 75 6d 2e 61 42 65 73 74  Stat4Accum.aBest
4220: 5b 5d 2c 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b  [], a[] */.    +
4230: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
4240: 2a 33 2a 6e 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b  *3*nColUp*(nCol+
4250: 6d 78 53 61 6d 70 6c 65 29 0a 23 65 6e 64 69 66  mxSample).#endif
4260: 0a 20 20 3b 0a 20 20 64 62 20 3d 20 73 71 6c 69  .  ;.  db = sqli
4270: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
4280: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
4290: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
42a0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 29  allocZero(db, n)
42b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
42c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
42d0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
42e0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
42f0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 64  urn;.  }..  p->d
4300: 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e 6e 52 6f  b = db;.  p->nRo
4310: 77 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  w = 0;.  p->nCol
4320: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b   = nCol;.  p->nK
4330: 65 79 43 6f 6c 20 3d 20 6e 4b 65 79 43 6f 6c 3b  eyCol = nKeyCol;
4340: 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  .  p->current.an
4350: 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29  DLt = (tRowcnt*)
4360: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 63 75 72 72  &p[1];.  p->curr
4370: 65 6e 74 2e 61 6e 45 71 20 3d 20 26 70 2d 3e 63  ent.anEq = &p->c
4380: 75 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 6e 43 6f  urrent.anDLt[nCo
4390: 6c 55 70 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  lUp];..#ifdef SQ
43a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
43b0: 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 53  4.  {.    u8 *pS
43c0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
43d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
43e0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e 6f 74  ocated space not
43f0: 20 79 65 74 20 61 73 73 69 67 6e 65 64 20 2a 2f   yet assigned */
4400: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
4430: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
4440: 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a  p->aSample[] */.
4450: 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d 20 2d  .    p->iGet = -
4460: 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61 6d 70  1;.    p->mxSamp
4470: 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b 0a 20  le = mxSample;. 
4480: 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 3d     p->nPSample =
4490: 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c 69 74   (tRowcnt)(sqlit
44a0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
44b0: 72 67 76 5b 32 5d 29 2f 28 6d 78 53 61 6d 70 6c  rgv[2])/(mxSampl
44c0: 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20 20 20  e/3+1) + 1);.   
44d0: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74   p->current.anLt
44e0: 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e 61   = &p->current.a
44f0: 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20 20 20  nEq[nColUp];.   
4500: 20 70 2d 3e 69 50 72 6e 20 3d 20 30 78 36 38 39   p->iPrn = 0x689
4510: 65 39 36 32 64 2a 28 75 33 32 29 6e 43 6f 6c 20  e962d*(u32)nCol 
4520: 5e 20 30 78 64 30 39 34 34 35 36 35 2a 28 75 33  ^ 0xd0944565*(u3
4530: 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  2)sqlite3_value_
4540: 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  int(argv[2]);.  
4550: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74  .    /* Set up t
4560: 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e 61 5b  he Stat4Accum.a[
4570: 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20 61 72  ] and aBest[] ar
4580: 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d 3e 61  rays */.    p->a
4590: 20 3d 20 28 73 74 72 75 63 74 20 53 74 61 74 34   = (struct Stat4
45a0: 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75 72 72  Sample*)&p->curr
45b0: 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55 70 5d  ent.anLt[nColUp]
45c0: 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74 20 3d  ;.    p->aBest =
45d0: 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65 5d   &p->a[mxSample]
45e0: 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d 20 28  ;.    pSpace = (
45f0: 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53 61 6d  u8*)(&p->a[mxSam
4600: 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  ple+nCol]);.    
4610: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78 53 61  for(i=0; i<(mxSa
4620: 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b 2b 29  mple+nCol); i++)
4630: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
4640: 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e 74 20  anEq = (tRowcnt 
4650: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
4660: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
4670: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
4680: 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e        p->a[i].an
4690: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29  Lt = (tRowcnt *)
46a0: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
46b0: 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  = (sizeof(tRowcn
46c0: 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20  t) * nColUp);.  
46d0: 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44 4c      p->a[i].anDL
46e0: 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70  t = (tRowcnt *)p
46f0: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
4700: 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74   (sizeof(tRowcnt
4710: 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20  ) * nColUp);.   
4720: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
4730: 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29 70 29  pSpace - (u8*)p)
4740: 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20 66 6f  ==n );.  .    fo
4750: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
4760: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 42  ++){.      p->aB
4770: 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20 69 3b  est[i].iCol = i;
4780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
4790: 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  f..  /* Return a
47a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
47b0: 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
47c0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
47d0: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
47e0: 6f 6e 6c 79 20 74 68 65 20 70 6f 69 6e 74 65 72  only the pointer
47f0: 20 28 74 68 65 20 32 6e 64 20 70 61 72 61 6d 65   (the 2nd parame
4800: 74 65 72 29 20 6d 61 74 74 65 72 73 2e 20 20 54  ter) matters.  T
4810: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
4820: 62 6a 65 63 74 0a 20 20 2a 2a 20 28 67 69 76 65  bject.  ** (give
4830: 6e 20 62 79 20 74 68 65 20 33 72 64 20 70 61 72  n by the 3rd par
4840: 61 6d 65 74 65 72 29 20 69 73 20 6e 65 76 65 72  ameter) is never
4850: 20 75 73 65 64 20 61 6e 64 20 63 61 6e 20 62 65   used and can be
4860: 20 61 6e 79 20 70 6f 73 69 74 69 76 65 0a 20 20   any positive.  
4870: 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 73  ** value. */.  s
4880: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
4890: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73  ob(context, p, s
48a0: 69 7a 65 6f 66 28 2a 70 29 2c 20 73 74 61 74 34  izeof(*p), stat4
48b0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 7d 0a 73  Destructor);.}.s
48c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63  tatic const Func
48d0: 44 65 66 20 73 74 61 74 49 6e 69 74 46 75 6e 63  Def statInitFunc
48e0: 64 65 66 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74  def = {.  2+IsSt
48f0: 61 74 34 2c 20 20 20 20 20 20 20 2f 2a 20 6e 41  at4,       /* nA
4900: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
4910: 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63  TF8,     /* func
4920: 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  Flags */.  0,   
4930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
4940: 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c  UserData */.  0,
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4960: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61  * pNext */.  sta
4970: 74 49 6e 69 74 2c 20 20 20 20 20 20 20 20 2f 2a  tInit,        /*
4980: 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20   xSFunc */.  0, 
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49a0: 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20   xFinalize */.  
49b0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
49c0: 20 2f 2a 20 78 56 61 6c 75 65 2c 20 78 49 6e 76   /* xValue, xInv
49d0: 65 72 73 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f  erse */.  "stat_
49e0: 69 6e 69 74 22 2c 20 20 20 20 20 2f 2a 20 7a 4e  init",     /* zN
49f0: 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a  ame */.  {0}.};.
4a00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4a10: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a  NABLE_STAT4./*.*
4a20: 2a 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c 64 20  * pNew and pOld 
4a30: 61 72 65 20 62 6f 74 68 20 63 61 6e 64 69 64 61  are both candida
4a40: 74 65 20 6e 6f 6e 2d 70 65 72 69 6f 64 69 63 20  te non-periodic 
4a50: 73 61 6d 70 6c 65 73 20 73 65 6c 65 63 74 65 64  samples selected
4a60: 20 66 6f 72 20 0a 2a 2a 20 74 68 65 20 73 61 6d   for .** the sam
4a70: 65 20 63 6f 6c 75 6d 6e 20 28 70 4e 65 77 2d 3e  e column (pNew->
4a80: 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c  iCol==pOld->iCol
4a90: 29 2e 20 49 67 6e 6f 72 69 6e 67 20 74 68 69 73  ). Ignoring this
4aa0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 0a 2a 2a 20   column and .** 
4ab0: 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f 6e 6c 79  considering only
4ac0: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 63 6f   any trailing co
4ad0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 73 61  lumns and the sa
4ae0: 6d 70 6c 65 20 68 61 73 68 20 76 61 6c 75 65 2c  mple hash value,
4af0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
4b00: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
4b10: 66 20 73 61 6d 70 6c 65 20 70 4e 65 77 20 69 73  f sample pNew is
4b20: 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65 64   to be preferred
4b30: 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 20 49   over pOld..** I
4b40: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
4b50: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
4b60: 20 74 68 65 20 63 61 72 64 69 6e 61 6c 69 74 69   the cardinaliti
4b70: 65 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  es of the select
4b80: 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 6f 72  ed.** column for
4b90: 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c 64 20 61   pNew and pOld a
4ba0: 72 65 20 65 71 75 61 6c 2c 20 69 73 20 70 4e 65  re equal, is pNe
4bb0: 77 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65  w to be preferre
4bc0: 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a  d over pOld..**.
4bd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4be0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f   assumes that fo
4bf0: 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  r each argument 
4c00: 73 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74  sample, the cont
4c10: 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61  ents of.** the a
4c20: 6e 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d  nEq[] array from
4c30: 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70   pSample->anEq[p
4c40: 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 2b 31 5d 20  Sample->iCol+1] 
4c50: 6f 6e 77 61 72 64 73 20 61 72 65 20 76 61 6c 69  onwards are vali
4c60: 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d. .*/.static in
4c70: 74 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  t sampleIsBetter
4c80: 50 6f 73 74 28 0a 20 20 53 74 61 74 34 41 63 63  Post(.  Stat4Acc
4c90: 75 6d 20 2a 70 41 63 63 75 6d 2c 20 0a 20 20 53  um *pAccum, .  S
4ca0: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77  tat4Sample *pNew
4cb0: 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  , .  Stat4Sample
4cc0: 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20 69 6e 74 20   *pOld.){.  int 
4cd0: 6e 43 6f 6c 20 3d 20 70 41 63 63 75 6d 2d 3e 6e  nCol = pAccum->n
4ce0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
4cf0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 69 43  assert( pNew->iC
4d00: 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29  ol==pOld->iCol )
4d10: 3b 0a 20 20 66 6f 72 28 69 3d 70 4e 65 77 2d 3e  ;.  for(i=pNew->
4d20: 69 43 6f 6c 2b 31 3b 20 69 3c 6e 43 6f 6c 3b 20  iCol+1; i<nCol; 
4d30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  i++){.    if( pN
4d40: 65 77 2d 3e 61 6e 45 71 5b 69 5d 3e 70 4f 6c 64  ew->anEq[i]>pOld
4d50: 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72 65 74 75  ->anEq[i] ) retu
4d60: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 70 4e  rn 1;.    if( pN
4d70: 65 77 2d 3e 61 6e 45 71 5b 69 5d 3c 70 4f 6c 64  ew->anEq[i]<pOld
4d80: 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72 65 74 75  ->anEq[i] ) retu
4d90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
4da0: 70 4e 65 77 2d 3e 69 48 61 73 68 3e 70 4f 6c 64  pNew->iHash>pOld
4db0: 2d 3e 69 48 61 73 68 20 29 20 72 65 74 75 72 6e  ->iHash ) return
4dc0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
4dd0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4de0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4df0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TAT4./*.** Retur
4e00: 6e 20 74 72 75 65 20 69 66 20 70 4e 65 77 20 69  n true if pNew i
4e10: 73 20 74 6f 20 62 65 20 70 72 65 66 65 72 72 65  s to be preferre
4e20: 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a  d over pOld..**.
4e30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4e40: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 66 6f   assumes that fo
4e50: 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  r each argument 
4e60: 73 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e 74  sample, the cont
4e70: 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 61  ents of.** the a
4e80: 6e 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f 6d  nEq[] array from
4e90: 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70   pSample->anEq[p
4ea0: 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e  Sample->iCol] on
4eb0: 77 61 72 64 73 20 61 72 65 20 76 61 6c 69 64 2e  wards are valid.
4ec0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4ed0: 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 0a  sampleIsBetter(.
4ee0: 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41    Stat4Accum *pA
4ef0: 63 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61  ccum, .  Stat4Sa
4f00: 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53  mple *pNew, .  S
4f10: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64  tat4Sample *pOld
4f20: 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45  .){.  tRowcnt nE
4f30: 71 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e 45  qNew = pNew->anE
4f40: 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20  q[pNew->iCol];. 
4f50: 20 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64 20   tRowcnt nEqOld 
4f60: 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c  = pOld->anEq[pOl
4f70: 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73  d->iCol];..  ass
4f80: 65 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61  ert( pOld->isPSa
4f90: 6d 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77 2d  mple==0 && pNew-
4fa0: 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29 3b  >isPSample==0 );
4fb0: 0a 20 20 61 73 73 65 72 74 28 20 49 73 53 74 61  .  assert( IsSta
4fc0: 74 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43 6f  t4 || (pNew->iCo
4fd0: 6c 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69 43  l==0 && pOld->iC
4fe0: 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28  ol==0) );..  if(
4ff0: 20 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64 29   (nEqNew>nEqOld)
5000: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
5010: 66 28 20 6e 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c  f( nEqNew==nEqOl
5020: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65  d ){.    if( pNe
5030: 77 2d 3e 69 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43  w->iCol<pOld->iC
5040: 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ol ) return 1;. 
5050: 20 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 2d     return (pNew-
5060: 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f  >iCol==pOld->iCo
5070: 6c 20 26 26 20 73 61 6d 70 6c 65 49 73 42 65 74  l && sampleIsBet
5080: 74 65 72 50 6f 73 74 28 70 41 63 63 75 6d 2c 20  terPost(pAccum, 
5090: 70 4e 65 77 2c 20 70 4f 6c 64 29 29 3b 0a 20 20  pNew, pOld));.  
50a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
50b0: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
50c0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 61 6d 70  contents of samp
50d0: 6c 65 20 2a 70 4e 65 77 20 69 6e 74 6f 20 74 68  le *pNew into th
50e0: 65 20 70 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20  e p->a[] array. 
50f0: 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a  If necessary,.**
5100: 20 72 65 6d 6f 76 65 20 74 68 65 20 6c 65 61 73   remove the leas
5110: 74 20 64 65 73 69 72 61 62 6c 65 20 73 61 6d 70  t desirable samp
5120: 6c 65 20 66 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74  le from p->a[] t
5130: 6f 20 6d 61 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a  o make room..*/.
5140: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
5150: 6c 65 49 6e 73 65 72 74 28 53 74 61 74 34 41 63  leInsert(Stat4Ac
5160: 63 75 6d 20 2a 70 2c 20 53 74 61 74 34 53 61 6d  cum *p, Stat4Sam
5170: 70 6c 65 20 2a 70 4e 65 77 2c 20 69 6e 74 20 6e  ple *pNew, int n
5180: 45 71 5a 65 72 6f 29 7b 0a 20 20 53 74 61 74 34  EqZero){.  Stat4
5190: 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20  Sample *pSample 
51a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
51b0: 20 61 73 73 65 72 74 28 20 49 73 53 74 61 74 34   assert( IsStat4
51c0: 20 7c 7c 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29   || nEqZero==0 )
51d0: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 34 41 63 63  ;..  /* Stat4Acc
51e0: 75 6d 2e 6e 4d 61 78 45 71 5a 65 72 6f 20 69 73  um.nMaxEqZero is
51f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
5200: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  mum number of le
5210: 61 64 69 6e 67 20 30 0a 20 20 2a 2a 20 76 61 6c  ading 0.  ** val
5220: 75 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b  ues in the anEq[
5230: 5d 20 61 72 72 61 79 20 6f 66 20 61 6e 79 20 73  ] array of any s
5240: 61 6d 70 6c 65 20 69 6e 20 53 74 61 74 34 41 63  ample in Stat4Ac
5250: 63 75 6d 2e 61 5b 5d 2e 20 49 6e 0a 20 20 2a 2a  cum.a[]. In.  **
5260: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
5270: 20 6e 4d 61 78 45 71 5a 65 72 6f 20 69 73 20 6e   nMaxEqZero is n
5280: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
5290: 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
52a0: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 73  re.  ** are no s
52b0: 61 6d 70 6c 65 73 20 77 69 74 68 20 53 74 61 74  amples with Stat
52c0: 34 53 61 6d 70 6c 65 2e 61 6e 45 71 5b 6d 5d 3d  4Sample.anEq[m]=
52d0: 3d 30 20 66 6f 72 20 28 6d 3e 3d 6e 29 2e 20 2a  =0 for (m>=n). *
52e0: 2f 0a 20 20 69 66 28 20 6e 45 71 5a 65 72 6f 3e  /.  if( nEqZero>
52f0: 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f 20 29 7b  p->nMaxEqZero ){
5300: 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65  .    p->nMaxEqZe
5310: 72 6f 20 3d 20 6e 45 71 5a 65 72 6f 3b 0a 20 20  ro = nEqZero;.  
5320: 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 73  }.  if( pNew->is
5330: 50 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20  PSample==0 ){.  
5340: 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70    Stat4Sample *p
5350: 55 70 67 72 61 64 65 20 3d 20 30 3b 0a 20 20 20  Upgrade = 0;.   
5360: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 61   assert( pNew->a
5370: 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3e  nEq[pNew->iCol]>
5380: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  0 );..    /* Thi
5390: 73 20 73 61 6d 70 6c 65 20 69 73 20 62 65 69 6e  s sample is bein
53a0: 67 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  g added because 
53b0: 74 68 65 20 70 72 65 66 69 78 20 74 68 61 74 20  the prefix that 
53c0: 65 6e 64 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a  ends in column .
53d0: 20 20 20 20 2a 2a 20 69 43 6f 6c 20 6f 63 63 75      ** iCol occu
53e0: 72 73 20 6d 61 6e 79 20 74 69 6d 65 73 20 69 6e  rs many times in
53f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 48 6f 77 65   the table. Howe
5400: 76 65 72 2c 20 69 66 20 77 65 20 68 61 76 65 20  ver, if we have 
5410: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 61  already.    ** a
5420: 64 64 65 64 20 61 20 73 61 6d 70 6c 65 20 74 68  dded a sample th
5430: 61 74 20 73 68 61 72 65 73 20 74 68 69 73 20 70  at shares this p
5440: 72 65 66 69 78 2c 20 74 68 65 72 65 20 69 73 20  refix, there is 
5450: 6e 6f 20 6e 65 65 64 20 74 6f 20 61 64 64 0a 20  no need to add. 
5460: 20 20 20 2a 2a 20 74 68 69 73 20 6f 6e 65 2e 20     ** this one. 
5470: 49 6e 73 74 65 61 64 2c 20 75 70 67 72 61 64 65  Instead, upgrade
5480: 20 74 68 65 20 70 72 69 6f 72 69 74 79 20 6f 66   the priority of
5490: 20 74 68 65 20 68 69 67 68 65 73 74 20 70 72 69   the highest pri
54a0: 6f 72 69 74 79 0a 20 20 20 20 2a 2a 20 65 78 69  ority.    ** exi
54b0: 73 74 69 6e 67 20 73 61 6d 70 6c 65 20 74 68 61  sting sample tha
54c0: 74 20 73 68 61 72 65 73 20 74 68 69 73 20 70 72  t shares this pr
54d0: 65 66 69 78 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  efix.  */.    fo
54e0: 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  r(i=p->nSample-1
54f0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
5500: 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20      Stat4Sample 
5510: 2a 70 4f 6c 64 20 3d 20 26 70 2d 3e 61 5b 69 5d  *pOld = &p->a[i]
5520: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64  ;.      if( pOld
5530: 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f  ->anEq[pNew->iCo
5540: 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l]==0 ){.       
5550: 20 69 66 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61   if( pOld->isPSa
5560: 6d 70 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mple ) return;. 
5570: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5580: 4f 6c 64 2d 3e 69 43 6f 6c 3e 70 4e 65 77 2d 3e  Old->iCol>pNew->
5590: 69 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  iCol );.        
55a0: 61 73 73 65 72 74 28 20 73 61 6d 70 6c 65 49 73  assert( sampleIs
55b0: 42 65 74 74 65 72 28 70 2c 20 70 4e 65 77 2c 20  Better(p, pNew, 
55c0: 70 4f 6c 64 29 20 29 3b 0a 20 20 20 20 20 20 20  pOld) );.       
55d0: 20 69 66 28 20 70 55 70 67 72 61 64 65 3d 3d 30   if( pUpgrade==0
55e0: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
55f0: 65 72 28 70 2c 20 70 4f 6c 64 2c 20 70 55 70 67  er(p, pOld, pUpg
5600: 72 61 64 65 29 20 29 7b 0a 20 20 20 20 20 20 20  rade) ){.       
5610: 20 20 20 70 55 70 67 72 61 64 65 20 3d 20 70 4f     pUpgrade = pO
5620: 6c 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ld;.        }.  
5630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5640: 69 66 28 20 70 55 70 67 72 61 64 65 20 29 7b 0a  if( pUpgrade ){.
5650: 20 20 20 20 20 20 70 55 70 67 72 61 64 65 2d 3e        pUpgrade->
5660: 69 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 69 43 6f  iCol = pNew->iCo
5670: 6c 3b 0a 20 20 20 20 20 20 70 55 70 67 72 61 64  l;.      pUpgrad
5680: 65 2d 3e 61 6e 45 71 5b 70 55 70 67 72 61 64 65  e->anEq[pUpgrade
5690: 2d 3e 69 43 6f 6c 5d 20 3d 20 70 4e 65 77 2d 3e  ->iCol] = pNew->
56a0: 61 6e 45 71 5b 70 55 70 67 72 61 64 65 2d 3e 69  anEq[pUpgrade->i
56b0: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  Col];.      goto
56c0: 20 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3b 0a 20   find_new_min;. 
56d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
56e0: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 72 65 6d  f necessary, rem
56f0: 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20  ove sample iMin 
5700: 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
5710: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e   the new sample.
5720: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61   */.  if( p->nSa
5730: 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c  mple>=p->mxSampl
5740: 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61  e ){.    Stat4Sa
5750: 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d  mple *pMin = &p-
5760: 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20  >a[p->iMin];.   
5770: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d   tRowcnt *anEq =
5780: 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20   pMin->anEq;.   
5790: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d   tRowcnt *anLt =
57a0: 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20   pMin->anLt;.   
57b0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20   tRowcnt *anDLt 
57c0: 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20  = pMin->anDLt;. 
57d0: 20 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70     sampleClear(p
57e0: 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20  ->db, pMin);.   
57f0: 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26   memmove(pMin, &
5800: 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28  pMin[1], sizeof(
5810: 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61  p->a[0])*(p->nSa
5820: 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29  mple-p->iMin-1))
5830: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  ;.    pSample = 
5840: 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65  &p->a[p->nSample
5850: 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  -1];.    pSample
5860: 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->nRowid = 0;.  
5870: 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20    pSample->anEq 
5880: 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d  = anEq;.    pSam
5890: 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44  ple->anDLt = anD
58a0: 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  Lt;.    pSample-
58b0: 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20  >anLt = anLt;.  
58c0: 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70    p->nSample = p
58d0: 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20  ->mxSample-1;.  
58e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f 77  }..  /* The "row
58f0: 73 20 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f 72  s less-than" for
5900: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
5910: 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  n must be greate
5920: 72 20 74 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a  r than that.  **
5930: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 73 61   for the last sa
5940: 6d 70 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e 61  mple in the p->a
5950: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
5960: 69 73 65 2c 20 74 68 65 20 73 61 6d 70 6c 65 73  ise, the samples
5970: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f   would.  ** be o
5980: 75 74 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a  ut of order. */.
5990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
59a0: 6d 70 6c 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  mple==0 .       
59b0: 7c 7c 20 70 4e 65 77 2d 3e 61 6e 4c 74 5b 70 2d  || pNew->anLt[p-
59c0: 3e 6e 43 6f 6c 2d 31 5d 20 3e 20 70 2d 3e 61 5b  >nCol-1] > p->a[
59d0: 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 2e 61 6e  p->nSample-1].an
59e0: 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 20 29 3b  Lt[p->nCol-1] );
59f0: 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
5a00: 65 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a  e new sample */.
5a10: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
5a20: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20  a[p->nSample];. 
5a30: 20 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70   sampleCopy(p, p
5a40: 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20  Sample, pNew);. 
5a50: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a   p->nSample++;..
5a60: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
5a70: 72 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72  rst nEqZero entr
5a80: 69 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b  ies in the anEq[
5a90: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65  ] array. */.  me
5aa0: 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e  mset(pSample->an
5ab0: 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52  Eq, 0, sizeof(tR
5ac0: 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b  owcnt)*nEqZero);
5ad0: 0a 0a 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a  ..find_new_min:.
5ae0: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
5af0: 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b  >=p->mxSample ){
5b00: 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  .    int iMin = 
5b10: 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  -1;.    for(i=0;
5b20: 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20   i<p->mxSample; 
5b30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
5b40: 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d 70 6c  p->a[i].isPSampl
5b50: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
5b60: 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30 20 7c      if( iMin<0 |
5b70: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
5b80: 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e 5d 2c  (p, &p->a[iMin],
5b90: 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a 20 20   &p->a[i]) ){.  
5ba0: 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b 0a        iMin = i;.
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5bc0: 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e 3e 3d    assert( iMin>=
5bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d 69 6e  0 );.    p->iMin
5be0: 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a 23   = iMin;.  }.}.#
5bf0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5c00: 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a  ENABLE_STAT4 */.
5c10: 0a 2f 2a 0a 2a 2a 20 46 69 65 6c 64 20 69 43 68  ./*.** Field iCh
5c20: 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
5c30: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 68 61  being scanned ha
5c40: 73 20 63 68 61 6e 67 65 64 2e 20 53 6f 20 61 74  s changed. So at
5c50: 20 74 68 69 73 20 70 6f 69 6e 74 0a 2a 2a 20 70   this point.** p
5c60: 2d 3e 63 75 72 72 65 6e 74 20 63 6f 6e 74 61 69  ->current contai
5c70: 6e 73 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74  ns a sample that
5c80: 20 72 65 66 6c 65 63 74 73 20 74 68 65 20 70 72   reflects the pr
5c90: 65 76 69 6f 75 73 20 72 6f 77 20 6f 66 20 74 68  evious row of th
5ca0: 65 0a 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20  e.** index. The 
5cb0: 76 61 6c 75 65 20 6f 66 20 61 6e 45 71 5b 69 43  value of anEq[iC
5cc0: 68 6e 67 5d 20 61 6e 64 20 73 75 62 73 65 71 75  hng] and subsequ
5cd0: 65 6e 74 20 61 6e 45 71 5b 5d 20 65 6c 65 6d 65  ent anEq[] eleme
5ce0: 6e 74 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 65  nts are.** corre
5cf0: 63 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ct at this point
5d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5d10: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
5d20: 6f 75 73 28 53 74 61 74 34 41 63 63 75 6d 20 2a  ous(Stat4Accum *
5d30: 70 2c 20 69 6e 74 20 69 43 68 6e 67 29 7b 0a 23  p, int iChng){.#
5d40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5d50: 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 6e 74 20  BLE_STAT4.  int 
5d60: 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  i;..  /* Check i
5d70: 66 20 61 6e 79 20 73 61 6d 70 6c 65 73 20 66 72  f any samples fr
5d80: 6f 6d 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61  om the aBest[] a
5d90: 72 72 61 79 20 73 68 6f 75 6c 64 20 62 65 20 70  rray should be p
5da0: 75 73 68 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  ushed.  ** into 
5db0: 49 6e 64 65 78 53 61 6d 70 6c 65 2e 61 5b 5d 20  IndexSample.a[] 
5dc0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20  at this point.  
5dd0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 28 70 2d 3e 6e  */.  for(i=(p->n
5de0: 43 6f 6c 2d 32 29 3b 20 69 3e 3d 69 43 68 6e 67  Col-2); i>=iChng
5df0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 53 74 61 74  ; i--){.    Stat
5e00: 34 53 61 6d 70 6c 65 20 2a 70 42 65 73 74 20 3d  4Sample *pBest =
5e10: 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d 3b 0a 20   &p->aBest[i];. 
5e20: 20 20 20 70 42 65 73 74 2d 3e 61 6e 45 71 5b 69     pBest->anEq[i
5e30: 5d 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ] = p->current.a
5e40: 6e 45 71 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  nEq[i];.    if( 
5e50: 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78  p->nSample<p->mx
5e60: 53 61 6d 70 6c 65 20 7c 7c 20 73 61 6d 70 6c 65  Sample || sample
5e70: 49 73 42 65 74 74 65 72 28 70 2c 20 70 42 65 73  IsBetter(p, pBes
5e80: 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e  t, &p->a[p->iMin
5e90: 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70  ]) ){.      samp
5ea0: 6c 65 49 6e 73 65 72 74 28 70 2c 20 70 42 65 73  leInsert(p, pBes
5eb0: 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, i);.    }.  }
5ec0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
5ed0: 74 20 6e 6f 20 73 61 6d 70 6c 65 20 63 6f 6e 74  t no sample cont
5ee0: 61 69 6e 73 20 61 6e 20 61 6e 45 71 5b 5d 20 65  ains an anEq[] e
5ef0: 6e 74 72 79 20 77 69 74 68 20 61 6e 20 69 6e 64  ntry with an ind
5f00: 65 78 20 6f 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d  ex of.  ** p->nM
5f10: 61 78 45 71 5a 65 72 6f 20 6f 72 20 67 72 65 61  axEqZero or grea
5f20: 74 65 72 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ter set to zero.
5f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e   */.  for(i=p->n
5f40: 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20  Sample-1; i>=0; 
5f50: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  i--){.    int j;
5f60: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d  .    for(j=p->nM
5f70: 61 78 45 71 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e  axEqZero; j<p->n
5f80: 43 6f 6c 3b 20 6a 2b 2b 29 20 61 73 73 65 72 74  Col; j++) assert
5f90: 28 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a  ( p->a[i].anEq[j
5fa0: 5d 3e 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ]>0 );.  }..  /*
5fb0: 20 55 70 64 61 74 65 20 74 68 65 20 61 6e 45 71   Update the anEq
5fc0: 5b 5d 20 66 69 65 6c 64 73 20 6f 66 20 61 6e 79  [] fields of any
5fd0: 20 73 61 6d 70 6c 65 73 20 61 6c 72 65 61 64 79   samples already
5fe0: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a 20   collected. */. 
5ff0: 20 69 66 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d   if( iChng<p->nM
6000: 61 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20 20 20  axEqZero ){.    
6010: 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65  for(i=p->nSample
6020: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
6030: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6040: 20 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b 20     for(j=iChng; 
6050: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
6060: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
6070: 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20  a[i].anEq[j]==0 
6080: 29 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a  ) p->a[i].anEq[j
6090: 5d 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61  ] = p->current.a
60a0: 6e 45 71 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  nEq[j];.      }.
60b0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61      }.    p->nMa
60c0: 78 45 71 5a 65 72 6f 20 3d 20 69 43 68 6e 67 3b  xEqZero = iChng;
60d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
60e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
60f0: 4c 45 5f 53 54 41 54 34 0a 20 20 55 4e 55 53 45  LE_STAT4.  UNUSE
6100: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 20 29  D_PARAMETER( p )
6110: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6120: 45 54 45 52 28 20 69 43 68 6e 67 20 29 3b 0a 23  ETER( iChng );.#
6130: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
6140: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6150: 20 74 68 65 20 73 74 61 74 5f 70 75 73 68 20 53   the stat_push S
6160: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 74  QL function:  st
6170: 61 74 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a 2a  at_push(P,C,R).*
6180: 2a 20 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a  * Arguments:.**.
6190: 2a 2a 20 20 20 20 50 20 20 20 20 20 50 6f 69 6e  **    P     Poin
61a0: 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74 34  ter to the Stat4
61b0: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 63 72 65  Accum object cre
61c0: 61 74 65 64 20 62 79 20 73 74 61 74 5f 69 6e 69  ated by stat_ini
61d0: 74 28 29 0a 2a 2a 20 20 20 20 43 20 20 20 20 20  t().**    C     
61e0: 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d 6f  Index of left-mo
61f0: 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69 66  st column to dif
6200: 66 65 72 20 66 72 6f 6d 20 70 72 65 76 69 6f 75  fer from previou
6210: 73 20 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20 20  s row.**    R   
6220: 20 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20    Rowid for the 
6230: 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d 69  current row.  Mi
6240: 67 68 74 20 62 65 20 61 20 6b 65 79 20 72 65 63  ght be a key rec
6250: 6f 72 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  ord for.**      
6260: 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49      WITHOUT ROWI
6270: 44 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  D tables..**.** 
6280: 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69 6f  This SQL functio
6290: 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
62a0: 20 4e 55 4c 4c 2e 20 20 49 74 27 73 20 70 75 72   NULL.  It's pur
62b0: 70 6f 73 65 20 69 74 20 74 6f 20 61 63 63 75 6d  pose it to accum
62c0: 75 6c 61 74 65 0a 2a 2a 20 73 74 61 74 69 73 74  ulate.** statist
62d0: 69 63 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f 72  ical data and/or
62e0: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
62f0: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
6300: 74 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69  t about the.** i
6310: 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79  ndex being analy
6320: 7a 65 64 2e 20 20 54 68 65 20 73 74 61 74 5f 67  zed.  The stat_g
6330: 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  et() SQL functio
6340: 6e 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20  n will later be 
6350: 75 73 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72 61  used to.** extra
6360: 63 74 20 72 65 6c 65 76 61 6e 74 20 69 6e 66 6f  ct relevant info
6370: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e 73  rmation for cons
6380: 74 72 75 63 74 69 6e 67 20 74 68 65 20 73 71 6c  tructing the sql
6390: 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
63a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70 61  ..**.** The R pa
63b0: 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79 20  rameter is only 
63c0: 75 73 65 64 20 66 6f 72 20 53 54 41 54 34 0a 2a  used for STAT4.*
63d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
63e0: 61 74 50 75 73 68 28 0a 20 20 73 71 6c 69 74 65  atPush(.  sqlite
63f0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6400: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
6410: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6420: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6430: 69 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 68 72  i;..  /* The thr
6440: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
6450: 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 74 61 74 34  ments */.  Stat4
6460: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
6470: 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  4Accum*)sqlite3_
6480: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6490: 30 5d 29 3b 0a 20 20 69 6e 74 20 69 43 68 6e 67  0]);.  int iChng
64a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
64b0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  _int(argv[1]);..
64c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
64d0: 45 52 28 20 61 72 67 63 20 29 3b 0a 20 20 55 4e  ER( argc );.  UN
64e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
64f0: 63 6f 6e 74 65 78 74 20 29 3b 0a 20 20 61 73 73  context );.  ass
6500: 65 72 74 28 20 70 2d 3e 6e 43 6f 6c 3e 30 20 29  ert( p->nCol>0 )
6510: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 68 6e  ;.  assert( iChn
6520: 67 3c 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20  g<p->nCol );..  
6530: 69 66 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29  if( p->nRow==0 )
6540: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6550: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
6560: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
6570: 2e 20 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  . Do initializat
6580: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ion. */.    for(
6590: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
65a0: 69 2b 2b 29 20 70 2d 3e 63 75 72 72 65 6e 74 2e  i++) p->current.
65b0: 61 6e 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  anEq[i] = 1;.  }
65c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 63  else{.    /* Sec
65d0: 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
65e0: 6e 74 20 63 61 6c 6c 73 20 67 65 74 20 70 72 6f  nt calls get pro
65f0: 63 65 73 73 65 64 20 68 65 72 65 20 2a 2f 0a 20  cessed here */. 
6600: 20 20 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65     samplePushPre
6610: 76 69 6f 75 73 28 70 2c 20 69 43 68 6e 67 29 3b  vious(p, iChng);
6620: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
6630: 61 6e 44 4c 74 5b 5d 2c 20 61 6e 4c 74 5b 5d 20  anDLt[], anLt[] 
6640: 61 6e 64 20 61 6e 45 71 5b 5d 20 74 6f 20 72 65  and anEq[] to re
6650: 66 6c 65 63 74 20 74 68 65 20 76 61 6c 75 65 73  flect the values
6660: 20 74 68 61 74 20 61 70 70 6c 79 0a 20 20 20 20   that apply.    
6670: 2a 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ** to the curren
6680: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 64  t row of the ind
6690: 65 78 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ex. */.    for(i
66a0: 3d 30 3b 20 69 3c 69 43 68 6e 67 3b 20 69 2b 2b  =0; i<iChng; i++
66b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
66c0: 65 6e 74 2e 61 6e 45 71 5b 69 5d 2b 2b 3b 0a 20  ent.anEq[i]++;. 
66d0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69     }.    for(i=i
66e0: 43 68 6e 67 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  Chng; i<p->nCol;
66f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
6700: 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d  current.anDLt[i]
6710: 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
6720: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
6730: 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e       p->current.
6740: 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63 75  anLt[i] += p->cu
6750: 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a 23  rrent.anEq[i];.#
6760: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 63  endif.      p->c
6770: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d  urrent.anEq[i] =
6780: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
6790: 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64 65  p->nRow++;.#ifde
67a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
67b0: 53 54 41 54 34 0a 20 20 69 66 28 20 73 71 6c 69  STAT4.  if( sqli
67c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
67d0: 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[2])==SQLITE_
67e0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 73  INTEGER ){.    s
67f0: 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 49 6e 74  ampleSetRowidInt
6800: 36 34 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75  64(p->db, &p->cu
6810: 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76  rrent, sqlite3_v
6820: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
6830: 32 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2]));.  }else{. 
6840: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
6850: 64 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  d(p->db, &p->cur
6860: 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  rent, sqlite3_va
6870: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32  lue_bytes(argv[2
6880: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
68b0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68c0: 67 76 5b 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70  gv[2]));.  }.  p
68d0: 2d 3e 63 75 72 72 65 6e 74 2e 69 48 61 73 68 20  ->current.iHash 
68e0: 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69  = p->iPrn = p->i
68f0: 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b  Prn*1103515245 +
6900: 20 31 32 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a   12345;.#endif..
6910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6920: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20  ABLE_STAT4.  {. 
6930: 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d     tRowcnt nLt =
6940: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74   p->current.anLt
6950: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20  [p->nCol-1];..  
6960: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
6970: 69 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65  is is to be a pe
6980: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49  riodic sample. I
6990: 66 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f  f so, add it. */
69a0: 0a 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d  .    if( (nLt/p-
69b0: 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74  >nPSample)!=(nLt
69c0: 2b 31 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20  +1)/p->nPSample 
69d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
69e0: 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20  ent.isPSample = 
69f0: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  1;.      p->curr
6a00: 65 6e 74 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ent.iCol = 0;.  
6a10: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6a20: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
6a30: 20 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20   p->nCol-1);.   
6a40: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6a50: 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20  PSample = 0;.   
6a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
6a70: 65 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  e the aBest[] ar
6a80: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ray. */.    for(
6a90: 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d  i=0; i<(p->nCol-
6aa0: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
6ab0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
6ac0: 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = i;.      if( i
6ad0: 3e 3d 69 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c  >=iChng || sampl
6ae0: 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70 2c  eIsBetterPost(p,
6af0: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70   &p->current, &p
6b00: 2d 3e 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20  ->aBest[i]) ){. 
6b10: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70         sampleCop
6b20: 79 28 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  y(p, &p->aBest[i
6b30: 5d 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b  ], &p->current);
6b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6b50: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74   }.#endif.}.stat
6b60: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
6b70: 20 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66   statPushFuncdef
6b80: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 34   = {.  2+IsStat4
6b90: 2c 20 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  ,       /* nArg 
6ba0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
6bb0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
6bc0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
6bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
6be0: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
6c00: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75  Next */.  statPu
6c10: 73 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53  sh,        /* xS
6c20: 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Func */.  0,    
6c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
6c40: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 30 2c 20  inalize */.  0, 
6c50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0,            /*
6c60: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
6c70: 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f 70 75 73  e */.  "stat_pus
6c80: 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  h",     /* zName
6c90: 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 23 64   */.  {0}.};..#d
6ca0: 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 53  efine STAT_GET_S
6cb0: 54 41 54 31 20 30 20 20 20 20 20 20 20 20 20 20  TAT1 0          
6cc0: 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e  /* "stat" column
6cd0: 20 6f 66 20 73 74 61 74 31 20 74 61 62 6c 65 20   of stat1 table 
6ce0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
6cf0: 47 45 54 5f 52 4f 57 49 44 20 31 20 20 20 20 20  GET_ROWID 1     
6d00: 20 20 20 20 20 2f 2a 20 22 72 6f 77 69 64 22 20       /* "rowid" 
6d10: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33  column of stat[3
6d20: 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66  4] entry */.#def
6d30: 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ine STAT_GET_NEQ
6d40: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f 2a     2          /*
6d50: 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e 20 6f 66   "neq" column of
6d60: 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20   stat[34] entry 
6d70: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f  */.#define STAT_
6d80: 47 45 54 5f 4e 4c 54 20 20 20 33 20 20 20 20 20  GET_NLT   3     
6d90: 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22 20 63 6f       /* "nlt" co
6da0: 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d  lumn of stat[34]
6db0: 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e   entry */.#defin
6dc0: 65 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20  e STAT_GET_NDLT 
6dd0: 20 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22   4          /* "
6de0: 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  ndlt" column of 
6df0: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
6e00: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
6e10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6e20: 74 61 74 5f 67 65 74 28 50 2c 4a 29 20 53 51 4c  tat_get(P,J) SQL
6e30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6e40: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75   routine is.** u
6e50: 73 65 64 20 74 6f 20 71 75 65 72 79 20 73 74 61  sed to query sta
6e60: 74 69 73 74 69 63 61 6c 20 69 6e 66 6f 72 6d 61  tistical informa
6e70: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 62 65  tion that has be
6e80: 65 6e 20 67 61 74 68 65 72 65 64 20 69 6e 74 6f  en gathered into
6e90: 0a 2a 2a 20 74 68 65 20 53 74 61 74 34 41 63 63  .** the Stat4Acc
6ea0: 75 6d 20 6f 62 6a 65 63 74 20 62 79 20 70 72 69  um object by pri
6eb0: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73 74 61 74  or calls to stat
6ec0: 5f 70 75 73 68 28 29 2e 20 20 54 68 65 20 50 20  _push().  The P 
6ed0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 68 61 73  parameter.** has
6ee0: 20 74 79 70 65 20 42 4c 4f 42 20 62 75 74 20 69   type BLOB but i
6ef0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
6f00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6f10: 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a  e Stat4Accum obj
6f20: 65 63 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ect..** The cont
6f30: 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 65 64 20  ent to returned 
6f40: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6f50: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 4a   the parameter J
6f60: 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 65  .** which is one
6f70: 20 6f 66 20 74 68 65 20 53 54 41 54 5f 47 45 54   of the STAT_GET
6f80: 5f 78 78 78 78 20 76 61 6c 75 65 73 20 64 65 66  _xxxx values def
6f90: 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
6fa0: 2a 20 54 68 65 20 73 74 61 74 5f 67 65 74 28 50  * The stat_get(P
6fb0: 2c 4a 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ,J) function is 
6fc0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  not available to
6fd0: 20 67 65 6e 65 72 69 63 20 53 51 4c 2e 20 20 49   generic SQL.  I
6fe0: 74 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64  t is.** inserted
6ff0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 61   as part of a ma
7000: 6e 75 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74  nually construct
7010: 65 64 20 62 79 74 65 63 6f 64 65 20 70 72 6f 67  ed bytecode prog
7020: 72 61 6d 2e 20 20 28 53 65 65 0a 2a 2a 20 74 68  ram.  (See.** th
7030: 65 20 63 61 6c 6c 53 74 61 74 47 65 74 28 29 20  e callStatGet() 
7040: 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 29 20  routine below.) 
7050: 20 49 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   It is guarantee
7060: 64 20 74 68 61 74 20 74 68 65 20 50 0a 2a 2a 20  d that the P.** 
7070: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 61  parameter will a
7080: 6c 77 61 79 73 20 62 65 20 61 20 70 6f 69 6e 65  lways be a poine
7090: 72 20 74 6f 20 61 20 53 74 61 74 34 41 63 63 75  r to a Stat4Accu
70a0: 6d 20 6f 62 6a 65 63 74 2c 20 6e 65 76 65 72 20  m object, never 
70b0: 61 0a 2a 2a 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  a.** NULL..**.**
70c0: 20 49 66 20 53 54 41 54 34 20 69 73 20 6e 6f 74   If STAT4 is not
70d0: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a   enabled, then J
70e0: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54   is always.** ST
70f0: 41 54 5f 47 45 54 5f 53 54 41 54 31 20 61 6e 64  AT_GET_STAT1 and
7100: 20 69 73 20 68 65 6e 63 65 20 6f 6d 69 74 74 65   is hence omitte
7110: 64 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  d and this routi
7120: 6e 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  ne becomes.** a 
7130: 6f 6e 65 2d 70 61 72 61 6d 65 74 65 72 20 66 75  one-parameter fu
7140: 6e 63 74 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74  nction, stat_get
7150: 28 50 29 2c 20 74 68 61 74 20 61 6c 77 61 79 73  (P), that always
7160: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
7170: 73 74 61 74 31 20 74 61 62 6c 65 20 65 6e 74 72  stat1 table entr
7180: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  y information..*
7190: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
71a0: 61 74 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33  atGet(.  sqlite3
71b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
71c0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
71d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
71e0: 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 34  *argv.){.  Stat4
71f0: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
7200: 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  4Accum*)sqlite3_
7210: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
7220: 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0]);.#ifdef SQLI
7230: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
7240: 20 20 2f 2a 20 53 54 41 54 34 20 68 61 73 20 61    /* STAT4 has a
7250: 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 20 74 68   parameter on th
7260: 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  is routine. */. 
7270: 20 69 6e 74 20 65 43 61 6c 6c 20 3d 20 73 71 6c   int eCall = sql
7280: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
7290: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[1]);.  asser
72a0: 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  t( argc==2 );.  
72b0: 61 73 73 65 72 74 28 20 65 43 61 6c 6c 3d 3d 53  assert( eCall==S
72c0: 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 7c 7c  TAT_GET_STAT1 ||
72d0: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
72e0: 5f 4e 45 51 20 0a 20 20 20 20 20 20 20 7c 7c 20  _NEQ .       || 
72f0: 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f  eCall==STAT_GET_
7300: 52 4f 57 49 44 20 7c 7c 20 65 43 61 6c 6c 3d 3d  ROWID || eCall==
7310: 53 54 41 54 5f 47 45 54 5f 4e 4c 54 0a 20 20 20  STAT_GET_NLT.   
7320: 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54      || eCall==ST
7330: 41 54 5f 47 45 54 5f 4e 44 4c 54 20 0a 20 20 29  AT_GET_NDLT .  )
7340: 3b 0a 20 20 69 66 28 20 65 43 61 6c 6c 3d 3d 53  ;.  if( eCall==S
7350: 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 29 0a  TAT_GET_STAT1 ).
7360: 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
7370: 61 72 67 63 3d 3d 31 20 29 3b 0a 23 65 6e 64 69  argc==1 );.#endi
7380: 66 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 52 65 74  f.  {.    /* Ret
7390: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 74 6f  urn the value to
73a0: 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 22 73   store in the "s
73b0: 74 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  tat" column of t
73c0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a  he sqlite_stat1.
73d0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 66 6f 72      ** table for
73e0: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20   this index..   
73f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 76   **.    ** The v
7400: 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
7410: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c   composed of a l
7420: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ist of integers 
7430: 64 65 73 63 72 69 62 69 6e 67 20 0a 20 20 20 20  describing .    
7440: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  ** the index. Th
7450: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
7460: 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 74  in the list is t
7470: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
7480: 6f 66 20 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69  of .    ** entri
7490: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  es in the index.
74a0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 61 64   There is one ad
74b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72  ditional integer
74c0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 0a 20 20   in the list .  
74d0: 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 69 6e    ** for each in
74e0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 54 68  dexed column. Th
74f0: 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  is additional in
7500: 74 65 67 65 72 20 69 73 20 61 6e 20 65 73 74 69  teger is an esti
7510: 6d 61 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  mate of.    ** t
7520: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
7530: 73 20 6d 61 74 63 68 65 64 20 62 79 20 61 20 73  s matched by a s
7540: 74 61 62 62 69 6e 67 20 71 75 65 72 79 20 6f 6e  tabbing query on
7550: 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
7560: 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20 77 69  .    ** a key wi
7570: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
7580: 64 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 66  ding number of f
7590: 69 65 6c 64 73 2e 20 49 6e 20 6f 74 68 65 72 20  ields. In other 
75a0: 77 6f 72 64 73 2c 0a 20 20 20 20 2a 2a 20 69 66  words,.    ** if
75b0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e   the index is on
75c0: 20 63 6f 6c 75 6d 6e 73 20 28 61 2c 62 29 20 61   columns (a,b) a
75d0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  nd the sqlite_st
75e0: 61 74 31 20 76 61 6c 75 65 20 69 73 20 0a 20 20  at1 value is .  
75f0: 20 20 2a 2a 20 22 31 30 30 20 31 30 20 32 22 2c    ** "100 10 2",
7600: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 65 73 74   then SQLite est
7610: 69 6d 61 74 65 73 20 74 68 61 74 3a 0a 20 20 20  imates that:.   
7620: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 2a 20 74   **.    **   * t
7630: 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
7640: 73 20 31 30 30 20 72 6f 77 73 2c 0a 20 20 20 20  s 100 rows,.    
7650: 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20 61 3d  **   * "WHERE a=
7660: 3f 22 20 6d 61 74 63 68 65 73 20 31 30 20 72 6f  ?" matches 10 ro
7670: 77 73 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  ws, and.    **  
7680: 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 20 41 4e   * "WHERE a=? AN
7690: 44 20 62 3d 3f 22 20 6d 61 74 63 68 65 73 20 32  D b=?" matches 2
76a0: 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 0a 20 20   rows..    **.  
76b0: 20 20 2a 2a 20 49 66 20 44 20 69 73 20 74 68 65    ** If D is the
76c0: 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e   count of distin
76d0: 63 74 20 76 61 6c 75 65 73 20 61 6e 64 20 4b 20  ct values and K 
76e0: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
76f0: 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72  ber of .    ** r
7700: 6f 77 73 2c 20 74 68 65 6e 20 65 61 63 68 20 65  ows, then each e
7710: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6d 70 75  stimate is compu
7720: 74 65 64 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20  ted as:.    **. 
7730: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 49 20 3d     **        I =
7740: 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a   (K+D-1)/D.    *
7750: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  /.    char *z;. 
7760: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 63     int i;..    c
7770: 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69  har *zRet = sqli
7780: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 28  te3MallocZero( (
7790: 70 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 29 2a 32 35  p->nKeyCol+1)*25
77a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74   );.    if( zRet
77b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
77c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
77d0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
77e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
77f0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
7800: 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c 20  e3_snprintf(24, 
7810: 7a 52 65 74 2c 20 22 25 6c 6c 75 22 2c 20 28 75  zRet, "%llu", (u
7820: 36 34 29 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  64)p->nRow);.   
7830: 20 7a 20 3d 20 7a 52 65 74 20 2b 20 73 71 6c 69   z = zRet + sqli
7840: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 65 74  te3Strlen30(zRet
7850: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
7860: 69 3c 70 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  i<p->nKeyCol; i+
7870: 2b 29 7b 0a 20 20 20 20 20 20 75 36 34 20 6e 44  +){.      u64 nD
7880: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 63 75 72  istinct = p->cur
7890: 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b 20  rent.anDLt[i] + 
78a0: 31 3b 0a 20 20 20 20 20 20 75 36 34 20 69 56 61  1;.      u64 iVa
78b0: 6c 20 3d 20 28 70 2d 3e 6e 52 6f 77 20 2b 20 6e  l = (p->nRow + n
78c0: 44 69 73 74 69 6e 63 74 20 2d 20 31 29 20 2f 20  Distinct - 1) / 
78d0: 6e 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 20  nDistinct;.     
78e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
78f0: 66 28 32 34 2c 20 7a 2c 20 22 20 25 6c 6c 75 22  f(24, z, " %llu"
7900: 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a  , iVal);.      z
7910: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
7920: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 61 73  n30(z);.      as
7930: 73 65 72 74 28 20 70 2d 3e 63 75 72 72 65 6e 74  sert( p->current
7940: 2e 61 6e 45 71 5b 69 5d 20 29 3b 0a 20 20 20 20  .anEq[i] );.    
7950: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  }.    assert( z[
7960: 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52  0]=='\0' && z>zR
7970: 65 74 20 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  et );..    sqlit
7980: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
7990: 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31  ontext, zRet, -1
79a0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
79b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
79c0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
79d0: 20 20 65 6c 73 65 20 69 66 28 20 65 43 61 6c 6c    else if( eCall
79e0: 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44  ==STAT_GET_ROWID
79f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
7a00: 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  Get<0 ){.      s
7a10: 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75  amplePushPreviou
7a20: 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  s(p, 0);.      p
7a30: 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20 20 20  ->iGet = 0;.    
7a40: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47 65  }.    if( p->iGe
7a50: 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  t<p->nSample ){.
7a60: 20 20 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c        Stat4Sampl
7a70: 65 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b 20 70  e *pS = p->a + p
7a80: 2d 3e 69 47 65 74 3b 0a 20 20 20 20 20 20 69 66  ->iGet;.      if
7a90: 28 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d 30 20  ( pS->nRowid==0 
7aa0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7ab0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
7ac0: 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e 69  context, pS->u.i
7ad0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  Rowid);.      }e
7ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7af0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
7b00: 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e  (context, pS->u.
7b10: 61 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52 6f 77  aRowid, pS->nRow
7b20: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
7b50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7b60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
7b70: 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b  owcnt *aCnt = 0;
7b80: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
7b90: 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65  >iGet<p->nSample
7ba0: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
7bb0: 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  eCall ){.      c
7bc0: 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51  ase STAT_GET_NEQ
7bd0: 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70  :  aCnt = p->a[p
7be0: 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20 62 72  ->iGet].anEq; br
7bf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
7c00: 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20 20 61  STAT_GET_NLT:  a
7c10: 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47  Cnt = p->a[p->iG
7c20: 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b  et].anLt; break;
7c30: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7c40: 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74 20 3d  {.        aCnt =
7c50: 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61   p->a[p->iGet].a
7c60: 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20 20 70  nDLt; .        p
7c70: 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20 20 20  ->iGet++;.      
7c80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7c90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20  .    }..    {.  
7ca0: 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d      char *zRet =
7cb0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
7cc0: 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29  ro(p->nCol * 25)
7cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74  ;.      if( zRet
7ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
7cf0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7d00: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
7d10: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
7d20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
7d30: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
7d40: 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20 20  = zRet;.        
7d50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7d60: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7d70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d80: 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c  intf(24, z, "%ll
7d90: 75 20 22 2c 20 28 75 36 34 29 61 43 6e 74 5b 69  u ", (u64)aCnt[i
7da0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 20  ]);.          z 
7db0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
7dc0: 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  30(z);.        }
7dd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7de0: 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a   z[0]=='\0' && z
7df0: 3e 7a 52 65 74 20 29 3b 0a 20 20 20 20 20 20 20  >zRet );.       
7e00: 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20   z[-1] = '\0';. 
7e10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7e20: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7e30: 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71  xt, zRet, -1, sq
7e40: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
7e50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
7e60: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7e70: 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a  ENABLE_STAT4 */.
7e80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
7e90: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
7ea0: 52 41 4d 45 54 45 52 28 20 61 72 67 63 20 29 3b  RAMETER( argc );
7eb0: 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
7ec0: 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73   const FuncDef s
7ed0: 74 61 74 47 65 74 46 75 6e 63 64 65 66 20 3d 20  tatGetFuncdef = 
7ee0: 7b 0a 20 20 31 2b 49 73 53 74 61 74 34 2c 20 20  {.  1+IsStat4,  
7ef0: 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a       /* nArg */.
7f00: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20    SQLITE_UTF8,  
7f10: 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20     /* funcFlags 
7f20: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7f30: 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61        /* pUserDa
7f40: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
7f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
7f60: 74 20 2a 2f 0a 20 20 73 74 61 74 47 65 74 2c 20  t */.  statGet, 
7f70: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 46 75 6e          /* xSFun
7f80: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
7f90: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61          /* xFina
7fa0: 6c 69 7a 65 20 2a 2f 0a 20 20 30 2c 20 30 2c 20  lize */.  0, 0, 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 56             /* xV
7fc0: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 20 2a  alue, xInverse *
7fd0: 2f 0a 20 20 22 73 74 61 74 5f 67 65 74 22 2c 20  /.  "stat_get", 
7fe0: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
7ff0: 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 73 74 61 74 69  .  {0}.};..stati
8000: 63 20 76 6f 69 64 20 63 61 6c 6c 53 74 61 74 47  c void callStatG
8010: 65 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  et(Vdbe *v, int 
8020: 72 65 67 53 74 61 74 34 2c 20 69 6e 74 20 69 50  regStat4, int iP
8030: 61 72 61 6d 2c 20 69 6e 74 20 72 65 67 4f 75 74  aram, int regOut
8040: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 72 65 67  ){.  assert( reg
8050: 4f 75 74 21 3d 72 65 67 53 74 61 74 34 20 26 26  Out!=regStat4 &&
8060: 20 72 65 67 4f 75 74 21 3d 72 65 67 53 74 61 74   regOut!=regStat
8070: 34 2b 31 20 29 3b 0a 23 69 66 64 65 66 20 53 51  4+1 );.#ifdef SQ
8080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
8090: 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  4.  sqlite3VdbeA
80a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
80b0: 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72 65 67  ger, iParam, reg
80c0: 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 69 66 20  Stat4+1);.#elif 
80d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 61  SQLITE_DEBUG.  a
80e0: 73 73 65 72 74 28 20 69 50 61 72 61 6d 3d 3d 53  ssert( iParam==S
80f0: 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 29 3b  TAT_GET_STAT1 );
8100: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
8110: 50 41 52 41 4d 45 54 45 52 28 20 69 50 61 72 61  PARAMETER( iPara
8120: 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  m );.#endif.  sq
8130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8140: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
8150: 20 30 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65   0, regStat4, re
8160: 67 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  gOut,.          
8170: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
8180: 29 26 73 74 61 74 47 65 74 46 75 6e 63 64 65 66  )&statGetFuncdef
8190: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
81a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
81b0: 67 65 50 35 28 76 2c 20 31 20 2b 20 49 73 53 74  geP5(v, 1 + IsSt
81c0: 61 74 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  at4);.}../*.** G
81d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
81e0: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
81f0: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  f all indices as
8200: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
8210: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
8220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8230: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
8240: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8250: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
8260: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
8270: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
8280: 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63  able whose indic
8290: 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61  es are to be ana
82a0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
82b0: 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49   *pOnlyIdx, /* I
82c0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79  f not NULL, only
82d0: 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e   analyze this on
82e0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
82f0: 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a   iStatCur,    /*
8300: 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75   Index of VdbeCu
8310: 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65 73  rsor that writes
8320: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
8330: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  1 table */.  int
8340: 20 69 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a   iMem,        /*
8350: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
8360: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69  y locations begi
8370: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
8380: 69 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20  iTab         /* 
8390: 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63  Next available c
83a0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ursor */.){.  sq
83b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
83c0: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61  se->db;    /* Da
83d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
83e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
8410: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
8420: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
8450: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  n index being an
8460: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
8470: 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
8480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8490: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64  e cursor */.  Vd
84a0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
84b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
84c0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
84d0: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
84e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8510: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72  er */.  int jZer
8520: 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20  oRows = -1;     
8530: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
8540: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
8550: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
8560: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
8590: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
85a0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20  ng pTab */.  u8 
85b0: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31  needTableCnt = 1
85c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
85d0: 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74  e to count the t
85e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
85f0: 67 4e 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d  gNewRowid = iMem
8600: 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ++;    /* Rowid 
8610: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 65 64  for the inserted
8620: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
8630: 20 72 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d   regStat4 = iMem
8640: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ++;       /* Reg
8650: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74  ister to hold St
8660: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
8670: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67  */.  int regChng
8680: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
8690: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
86a0: 61 6e 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c  anged index fiel
86b0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
86c0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
86d0: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
86e0: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f   iMem++;       /
86f0: 2a 20 52 6f 77 69 64 20 61 72 67 75 6d 65 6e 74  * Rowid argument
8700: 20 70 61 73 73 65 64 20 74 6f 20 73 74 61 74 5f   passed to stat_
8710: 70 75 73 68 28 29 20 2a 2f 0a 23 65 6e 64 69 66  push() */.#endif
8720: 0a 20 20 69 6e 74 20 72 65 67 54 65 6d 70 20 3d  .  int regTemp =
8730: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
8740: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
8750: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
8760: 6e 74 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20  nt regTabname = 
8770: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
8780: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
8790: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ng table name */
87a0: 0a 20 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d  .  int regIdxnam
87b0: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
87c0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
87d0: 61 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d  aining index nam
87e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74  e */.  int regSt
87f0: 61 74 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  at1 = iMem++;   
8800: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
8810: 20 74 68 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e   the stat column
8820: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31   of sqlite_stat1
8830: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
8840: 76 20 3d 20 69 4d 65 6d 3b 20 20 20 20 20 20 20  v = iMem;       
8850: 20 20 20 2f 2a 20 4d 55 53 54 20 42 45 20 4c 41     /* MUST BE LA
8860: 53 54 20 28 73 65 65 20 62 65 6c 6f 77 29 20 2a  ST (see below) *
8870: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8880: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
8890: 5f 48 4f 4f 4b 0a 20 20 54 61 62 6c 65 20 2a 70  _HOOK.  Table *p
88a0: 53 74 61 74 31 20 3d 20 30 3b 20 0a 23 65 6e 64  Stat1 = 0; .#end
88b0: 69 66 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  if..  pParse->nM
88c0: 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  em = MAX(pParse-
88d0: 3e 6e 4d 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20  >nMem, iMem);.  
88e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
88f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
8900: 28 20 76 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( v==0 || NEVER(
8910: 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pTab==0) ){.    
8920: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8930: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20  ( pTab->tnum==0 
8940: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
8950: 20 67 61 74 68 65 72 20 73 74 61 74 69 73 74 69   gather statisti
8960: 63 73 20 6f 6e 20 76 69 65 77 73 20 6f 72 20 76  cs on views or v
8970: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
8980: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8990: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
89a0: 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c  trlike("sqlite\\
89b0: 5f 25 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  _%", pTab->zName
89c0: 2c 20 27 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20  , '\\')==0 ){.  
89d0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68    /* Do not gath
89e0: 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e  er statistics on
89f0: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 73 20 2a   system tables *
8a00: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
8a10: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
8a20: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
8a30: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
8a40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
8a50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
8a60: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
8a70: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
8a80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8a90: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
8aa0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
8ab0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
8ac0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
8ad0: 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
8ae0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
8af0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c  rse, SQLITE_ANAL
8b00: 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  YZE, pTab->zName
8b10: 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
8b20: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
8b30: 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
8b40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
8b50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8b60: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
8b70: 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65  K.  if( db->xPre
8b80: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 29  UpdateCallback )
8b90: 7b 0a 20 20 20 20 70 53 74 61 74 31 20 3d 20 28  {.    pStat1 = (
8ba0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33 44 62  Table*)sqlite3Db
8bb0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8bc0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 2b 20 31  izeof(Table) + 1
8bd0: 33 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  3);.    if( pSta
8be0: 74 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  t1==0 ) return;.
8bf0: 20 20 20 20 70 53 74 61 74 31 2d 3e 7a 4e 61 6d      pStat1->zNam
8c00: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 74 61  e = (char*)&pSta
8c10: 74 31 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  t1[1];.    memcp
8c20: 79 28 70 53 74 61 74 31 2d 3e 7a 4e 61 6d 65 2c  y(pStat1->zName,
8c30: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
8c40: 20 31 33 29 3b 0a 20 20 20 20 70 53 74 61 74 31   13);.    pStat1
8c50: 2d 3e 6e 43 6f 6c 20 3d 20 33 3b 0a 20 20 20 20  ->nCol = 3;.    
8c60: 70 53 74 61 74 31 2d 3e 69 50 4b 65 79 20 3d 20  pStat1->iPKey = 
8c70: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -1;.    sqlite3V
8c80: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
8c90: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4e 6f 6f 70  ->pVdbe, OP_Noop
8ca0: 2c 20 30 2c 20 30 2c 20 30 2c 28 63 68 61 72 2a  , 0, 0, 0,(char*
8cb0: 29 70 53 74 61 74 31 2c 50 34 5f 44 59 4e 42 4c  )pStat1,P4_DYNBL
8cc0: 4f 42 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OB);.  }.#endif.
8cd0: 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69 73 68 20  .  /* Establish 
8ce0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
8cf0: 68 65 20 74 61 62 6c 65 20 61 74 20 74 68 65 20  he table at the 
8d00: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c 65 76  shared-cache lev
8d10: 65 6c 2e 20 0a 20 20 2a 2a 20 4f 70 65 6e 20 61  el. .  ** Open a
8d20: 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
8d30: 72 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  r on the table. 
8d40: 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  Also allocate a 
8d50: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
8d60: 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 73 63  ** to use for sc
8d70: 61 6e 6e 69 6e 67 20 69 6e 64 65 78 65 73 20 28  anning indexes (
8d80: 69 49 64 78 43 75 72 29 2e 20 4e 6f 20 69 6e 64  iIdxCur). No ind
8d90: 65 78 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  ex cursor is ope
8da0: 6e 65 64 20 61 74 0a 20 20 2a 2a 20 74 68 69 73  ned at.  ** this
8db0: 20 74 69 6d 65 20 74 68 6f 75 67 68 2e 20 20 2a   time though.  *
8dc0: 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
8dd0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
8de0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
8df0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8e00: 20 69 54 61 62 43 75 72 20 3d 20 69 54 61 62 2b   iTabCur = iTab+
8e10: 2b 3b 0a 20 20 69 49 64 78 43 75 72 20 3d 20 69  +;.  iIdxCur = i
8e20: 54 61 62 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d  Tab++;.  pParse-
8e30: 3e 6e 54 61 62 20 3d 20 4d 41 58 28 70 50 61 72  >nTab = MAX(pPar
8e40: 73 65 2d 3e 6e 54 61 62 2c 20 69 54 61 62 29 3b  se->nTab, iTab);
8e50: 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
8e60: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
8e70: 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Cur, iDb, pTab, 
8e80: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
8e90: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
8ea0: 74 72 69 6e 67 28 76 2c 20 72 65 67 54 61 62 6e  tring(v, regTabn
8eb0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
8ec0: 29 3b 0a 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  );..  for(pIdx=p
8ed0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
8ee0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8ef0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  ext){.    int nC
8f00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
8f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8f20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
8f30: 70 49 64 78 2e 20 22 4e 22 20 2a 2f 0a 20 20 20  pIdx. "N" */.   
8f40: 20 69 6e 74 20 61 64 64 72 52 65 77 69 6e 64 3b   int addrRewind;
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f60: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22 4f 50  * Address of "OP
8f70: 5f 52 65 77 69 6e 64 20 69 49 64 78 43 75 72 22  _Rewind iIdxCur"
8f80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
8f90: 4e 65 78 74 52 6f 77 3b 20 20 20 20 20 20 20 20  NextRow;        
8fa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
8fb0: 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77 3a 22 20   of "next_row:" 
8fc0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
8fd0: 72 20 2a 7a 49 64 78 4e 61 6d 65 3b 20 20 20 20  r *zIdxName;    
8fe0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8ff0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
9000: 20 69 6e 74 20 6e 43 6f 6c 54 65 73 74 3b 20 20   int nColTest;  
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9020: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
9030: 6d 6e 73 20 74 6f 20 74 65 73 74 20 66 6f 72 20  mns to test for 
9040: 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 20 20  changes */..    
9050: 69 66 28 20 70 4f 6e 6c 79 49 64 78 20 26 26 20  if( pOnlyIdx && 
9060: 70 4f 6e 6c 79 49 64 78 21 3d 70 49 64 78 20 29  pOnlyIdx!=pIdx )
9070: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9080: 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
9090: 78 57 68 65 72 65 3d 3d 30 20 29 20 6e 65 65 64  xWhere==0 ) need
90a0: 54 61 62 6c 65 43 6e 74 20 3d 20 30 3b 0a 20 20  TableCnt = 0;.  
90b0: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
90c0: 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61  pTab) && IsPrima
90d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
90e0: 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   ){.      nCol =
90f0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
9100: 20 20 20 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d        zIdxName =
9110: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
9120: 20 20 20 20 6e 43 6f 6c 54 65 73 74 20 3d 20 6e      nColTest = n
9130: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Col - 1;.    }el
9140: 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  se{.      nCol =
9150: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
9160: 20 20 20 20 20 20 7a 49 64 78 4e 61 6d 65 20 3d        zIdxName =
9170: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pIdx->zName;.  
9180: 20 20 20 20 6e 43 6f 6c 54 65 73 74 20 3d 20 70      nColTest = p
9190: 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
91a0: 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   ? pIdx->nKeyCol
91b0: 2d 31 20 3a 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20  -1 : nCol-1;.   
91c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c   }..    /* Popul
91d0: 61 74 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ate the register
91e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
91f0: 69 6e 64 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  index name. */. 
9200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
9210: 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 49  adString(v, regI
9220: 64 78 6e 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65  dxname, zIdxName
9230: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
9240: 6e 74 28 28 76 2c 20 22 41 6e 61 6c 79 73 69 73  nt((v, "Analysis
9250: 20 66 6f 72 20 25 73 2e 25 73 22 2c 20 70 54 61   for %s.%s", pTa
9260: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 64 78 4e 61  b->zName, zIdxNa
9270: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  me));..    /*.  
9280: 20 20 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65    ** Pseudo-code
9290: 20 66 6f 72 20 6c 6f 6f 70 20 74 68 61 74 20 63   for loop that c
92a0: 61 6c 6c 73 20 73 74 61 74 5f 70 75 73 68 28 29  alls stat_push()
92b0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
92c0: 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20    Rewind csr.   
92d0: 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72   **   if eof(csr
92e0: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63  ) goto end_of_sc
92f0: 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  an;.    **   reg
9300: 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20  Chng = 0.    ** 
9310: 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72    goto chng_addr
9320: 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  _0;.    **.    *
9330: 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20  *  next_row:.   
9340: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
9350: 30 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20 69  0.    **   if( i
9360: 64 78 28 30 29 20 21 3d 20 72 65 67 50 72 65 76  dx(0) != regPrev
9370: 28 30 29 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f  (0) ) goto chng_
9380: 61 64 64 72 5f 30 0a 20 20 20 20 2a 2a 20 20 20  addr_0.    **   
9390: 72 65 67 43 68 6e 67 20 3d 20 31 0a 20 20 20 20  regChng = 1.    
93a0: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 31 29 20  **   if( idx(1) 
93b0: 21 3d 20 72 65 67 50 72 65 76 28 31 29 20 29 20  != regPrev(1) ) 
93c0: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31  goto chng_addr_1
93d0: 0a 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20  .    **   ....  
93e0: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
93f0: 20 4e 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f   N.    **   goto
9400: 20 63 68 6e 67 5f 61 64 64 72 5f 4e 0a 20 20 20   chng_addr_N.   
9410: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67   **.    **  chng
9420: 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20 2a 2a 20  _addr_0:.    ** 
9430: 20 20 72 65 67 50 72 65 76 28 30 29 20 3d 20 69    regPrev(0) = i
9440: 64 78 28 30 29 0a 20 20 20 20 2a 2a 20 20 63 68  dx(0).    **  ch
9450: 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20 2a  ng_addr_1:.    *
9460: 2a 20 20 20 72 65 67 50 72 65 76 28 31 29 20 3d  *   regPrev(1) =
9470: 20 69 64 78 28 31 29 0a 20 20 20 20 2a 2a 20 20   idx(1).    **  
9480: 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ....    **.    *
9490: 2a 20 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65  *  endDistinctTe
94a0: 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  st:.    **   reg
94b0: 52 6f 77 69 64 20 3d 20 69 64 78 28 72 6f 77 69  Rowid = idx(rowi
94c0: 64 29 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74  d).    **   stat
94d0: 5f 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67  _push(P, regChng
94e0: 2c 20 72 65 67 52 6f 77 69 64 29 0a 20 20 20 20  , regRowid).    
94f0: 2a 2a 20 20 20 4e 65 78 74 20 63 73 72 0a 20 20  **   Next csr.  
9500: 20 20 2a 2a 20 20 20 69 66 20 21 65 6f 66 28 63    **   if !eof(c
9510: 73 72 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f  sr) goto next_ro
9520: 77 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w;.    **.    **
9530: 20 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3a 0a 20    end_of_scan:. 
9540: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61     */..    /* Ma
9550: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 61 72  ke sure there ar
9560: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
9570: 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 20  cells allocated 
9580: 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 0a  to accommodate .
9590: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 67 50 72      ** the regPr
95a0: 65 76 20 61 72 72 61 79 20 61 6e 64 20 61 20 74  ev array and a t
95b0: 72 61 69 6c 69 6e 67 20 72 6f 77 69 64 20 28 74  railing rowid (t
95c0: 68 65 20 72 6f 77 69 64 20 73 6c 6f 74 20 69 73  he rowid slot is
95d0: 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
95e0: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 61   when building a
95f0: 20 72 65 63 6f 72 64 20 74 6f 20 69 6e 73 65 72   record to inser
9600: 74 20 69 6e 74 6f 20 74 68 65 20 73 61 6d 70 6c  t into the sampl
9610: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 0a 20 20 20  e column of .   
9620: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73   ** the sqlite_s
9630: 74 61 74 34 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tat4 table.  */.
9640: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9650: 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e   = MAX(pParse->n
9660: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 6e 43 6f  Mem, regPrev+nCo
9670: 6c 54 65 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  lTest);..    /* 
9680: 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
9690: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 69   cursor on the i
96a0: 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79  ndex being analy
96b0: 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  zed. */.    asse
96c0: 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74 65 33  rt( iDb==sqlite3
96d0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
96e0: 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29  , pIdx->pSchema)
96f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9710: 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
9720: 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  r, pIdx->tnum, i
9730: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
9740: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
9750: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
9760: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
9770: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
9780: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
9790: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 74 61 74   Invoke the stat
97a0: 5f 69 6e 69 74 28 29 20 66 75 6e 63 74 69 6f 6e  _init() function
97b0: 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  . The arguments 
97c0: 61 72 65 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20  are:.    ** .   
97d0: 20 2a 2a 20 20 20 20 28 31 29 20 74 68 65 20 6e   **    (1) the n
97e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
97f0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e   in the index in
9800: 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f 77 69  cluding the rowi
9810: 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  d.    **        
9820: 28 6f 72 20 66 6f 72 20 61 20 57 49 54 48 4f 55  (or for a WITHOU
9830: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74  T ROWID table, t
9840: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 4b 20  he number of PK 
9850: 63 6f 6c 75 6d 6e 73 29 2c 0a 20 20 20 20 2a 2a  columns),.    **
9860: 20 20 20 20 28 32 29 20 74 68 65 20 6e 75 6d 62      (2) the numb
9870: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9880: 20 74 68 65 20 6b 65 79 20 77 69 74 68 6f 75 74   the key without
9890: 20 74 68 65 20 72 6f 77 69 64 2f 70 6b 0a 20 20   the rowid/pk.  
98a0: 20 20 2a 2a 20 20 20 20 28 33 29 20 74 68 65 20    **    (3) the 
98b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
98c0: 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20  n the index,.   
98d0: 20 2a 2a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   **.    **.    *
98e0: 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
98f0: 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  ment is only use
9900: 64 20 66 6f 72 20 53 54 41 54 34 0a 20 20 20 20  d for STAT4.    
9910: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9920: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
9930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9940: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
9950: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
9960: 74 34 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t4+3);.#endif.  
9970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9980: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9990: 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74  r, nCol, regStat
99a0: 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
99b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
99c0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
99d0: 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61  >nKeyCol, regSta
99e0: 74 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+2);.    sqlit
99f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9a00: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
9a10: 20 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67   regStat4+1, reg
9a20: 53 74 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20  Stat4,.         
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
9a40: 72 2a 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63  r*)&statInitFunc
9a50: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
9a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9a70: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
9a80: 73 53 74 61 74 34 29 3b 0a 0a 20 20 20 20 2f 2a  sStat4);..    /*
9a90: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
9aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9ab0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
9ac0: 20 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20    Rewind csr.   
9ad0: 20 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72   **   if eof(csr
9ae0: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63  ) goto end_of_sc
9af0: 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  an;.    **   reg
9b00: 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20  Chng = 0.    ** 
9b10: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68    goto next_push
9b20: 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  _0;.    **.    *
9b30: 2f 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e 64  /.    addrRewind
9b40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9b50: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
9b60: 64 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20  d, iIdxCur);.   
9b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
9b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9b90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9ba0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68 6e  teger, 0, regChn
9bb0: 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78 74  g);.    addrNext
9bc0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
9bd0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
9be0: 0a 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65  ..    if( nColTe
9bf0: 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  st>0 ){.      in
9c00: 74 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73  t endDistinctTes
9c10: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
9c20: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
9c30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 47 6f  ;.      int *aGo
9c40: 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20 20 20  toChng;         
9c50: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9c60: 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  f jump instructi
9c70: 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  on addresses */.
9c80: 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e 67 20        aGotoChng 
9c90: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9ca0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
9cb0: 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73 74 29  f(int)*nColTest)
9cc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47 6f 74  ;.      if( aGot
9cd0: 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e 74 69  oChng==0 ) conti
9ce0: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 0a 20  nue;..      /*. 
9cf0: 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f       **  next_ro
9d00: 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  w:.      **   re
9d10: 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20 20 20  gChng = 0.      
9d20: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20  **   if( idx(0) 
9d30: 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20  != regPrev(0) ) 
9d40: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30  goto chng_addr_0
9d50: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43  .      **   regC
9d60: 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20 2a 2a  hng = 1.      **
9d70: 20 20 20 69 66 28 20 69 64 78 28 31 29 20 21 3d     if( idx(1) !=
9d80: 20 72 65 67 50 72 65 76 28 31 29 20 29 20 67 6f   regPrev(1) ) go
9d90: 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20  to chng_addr_1. 
9da0: 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a 20 20       **   ....  
9db0: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9dc0: 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20 20   = N.      **   
9dd0: 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e 63 74  goto endDistinct
9de0: 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  Test.      */.  
9df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9e00: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
9e10: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  );.      addrNex
9e20: 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
9e30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9e40: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c  ;.      if( nCol
9e50: 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64 78 2d  Test==1 && pIdx-
9e60: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49  >nKeyCol==1 && I
9e70: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
9e80: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  x) ){.        /*
9e90: 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d 63 6f   For a single-co
9ea0: 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e 64 65  lumn UNIQUE inde
9eb0: 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76 65 20  x, once we have 
9ec0: 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  found a non-NULL
9ed0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 2c  .        ** row,
9ee0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 6c   we know that al
9ef0: 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c 6c 20  l the rest will 
9f00: 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73 6f 20  be distinct, so 
9f10: 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20 2a 2a  skip .        **
9f20: 20 73 75 62 73 65 71 75 65 6e 74 20 64 69 73 74   subsequent dist
9f30: 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73 2e 20  inctness tests. 
9f40: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
9f50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9f60: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 50  OP_NotNull, regP
9f70: 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74  rev, endDistinct
9f80: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 56  Test);.        V
9f90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
9fb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73  r(i=0; i<nColTes
9fc0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
9fd0: 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d 20 28   char *pColl = (
9fe0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63  char*)sqlite3Loc
9ff0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
a000: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
a010: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
a020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a030: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
a040: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 20   regChng);.     
a050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a060: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a070: 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72  n, iIdxCur, i, r
a080: 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 20  egTemp);.       
a090: 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20 3d 20   aGotoChng[i] = 
a0a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a0b0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a0c0: 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c  _Ne, regTemp, 0,
a0d0: 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43 6f 6c   regPrev+i, pCol
a0e0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
a0f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a100: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
a110: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
a120: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
a130: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
a140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a150: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
a160: 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73 74 2c  teger, nColTest,
a170: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 20   regChng);.     
a180: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
a190: 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63 74 54  (v, endDistinctT
a1a0: 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20 20 20  est);.  .  .    
a1b0: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 63    /*.      **  c
a1c0: 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20  hng_addr_0:.    
a1d0: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30    **   regPrev(0
a1e0: 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20 20 20  ) = idx(0).     
a1f0: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 31   **  chng_addr_1
a200: 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  :.      **   reg
a210: 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31 29  Prev(1) = idx(1)
a220: 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20  .      **  .... 
a230: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
a240: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a250: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52 6f 77  e(v, addrNextRow
a260: 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  -1);.      for(i
a270: 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20  =0; i<nColTest; 
a280: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
a290: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a2a0: 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67 5b 69  e(v, aGotoChng[i
a2b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
a2c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a2d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
a2e0: 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65 76 2b  Cur, i, regPrev+
a2f0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
a300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
a310: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
a320: 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a 20  DistinctTest);. 
a330: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a340: 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68 6e 67  ee(db, aGotoChng
a350: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
a360: 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f  /*.    **  chng_
a370: 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a 20 20  addr_N:.    **  
a380: 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78 28   regRowid = idx(
a390: 72 6f 77 69 64 29 20 20 20 20 20 20 20 20 20 20  rowid)          
a3a0: 20 20 2f 2f 20 53 54 41 54 34 20 6f 6e 6c 79 0a    // STAT4 only.
a3b0: 20 20 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75      **   stat_pu
a3c0: 73 68 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72  sh(P, regChng, r
a3d0: 65 67 52 6f 77 69 64 29 20 20 2f 2f 20 33 72 64  egRowid)  // 3rd
a3e0: 20 70 61 72 61 6d 65 74 65 72 20 53 54 41 54 34   parameter STAT4
a3f0: 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 4e   only.    **   N
a400: 65 78 74 20 63 73 72 0a 20 20 20 20 2a 2a 20 20  ext csr.    **  
a410: 20 69 66 20 21 65 6f 66 28 63 73 72 29 20 67 6f   if !eof(csr) go
a420: 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20  to next_row;.   
a430: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
a440: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
a450: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
a460: 77 69 64 3d 3d 28 72 65 67 53 74 61 74 34 2b 32  wid==(regStat4+2
a470: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 48 61 73  ) );.    if( Has
a480: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
a490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a4a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
a4b0: 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
a4c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  regRowid);.    }
a4d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
a4e0: 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
a4f0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
a500: 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20  pIdx->pTable);. 
a510: 20 20 20 20 20 69 6e 74 20 6a 2c 20 6b 2c 20 72       int j, k, r
a520: 65 67 4b 65 79 3b 0a 20 20 20 20 20 20 72 65 67  egKey;.      reg
a530: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Key = sqlite3Get
a540: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
a550: 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
a560: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a570: 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
a580: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
a590: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
a5a0: 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b  fIndex(pIdx, pPk
a5b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a  ->aiColumn[j]);.
a5c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5d0: 6b 3e 3d 30 20 26 26 20 6b 3c 70 49 64 78 2d 3e  k>=0 && k<pIdx->
a5e0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
a5f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a600: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a610: 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 72  n, iIdxCur, k, r
a620: 65 67 4b 65 79 2b 6a 29 3b 0a 20 20 20 20 20 20  egKey+j);.      
a630: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
a640: 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 61 43  , "%s", pTab->aC
a650: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
a660: 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20  [j]].zName));.  
a670: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a680: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a690: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a6a0: 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b 65  regKey, pPk->nKe
a6b0: 79 43 6f 6c 2c 20 72 65 67 52 6f 77 69 64 29 3b  yCol, regRowid);
a6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a6d0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
a6e0: 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 70  Parse, regKey, p
a6f0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
a700: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
a710: 73 73 65 72 74 28 20 72 65 67 43 68 6e 67 3d 3d  ssert( regChng==
a720: 28 72 65 67 53 74 61 74 34 2b 31 29 20 29 3b 0a  (regStat4+1) );.
a730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a740: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
a750: 74 69 6f 6e 30 2c 20 31 2c 20 72 65 67 53 74 61  tion0, 1, regSta
a760: 74 34 2c 20 72 65 67 54 65 6d 70 2c 0a 20 20 20  t4, regTemp,.   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 28 63 68 61 72 2a 29 26 73 74 61 74 50 75    (char*)&statPu
a790: 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55  shFuncdef, P4_FU
a7a0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
a7b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a7c0: 76 2c 20 32 2b 49 73 53 74 61 74 34 29 3b 0a 20  v, 2+IsStat4);. 
a7d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a7e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
a7f0: 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 65   iIdxCur, addrNe
a800: 78 74 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  xtRow); VdbeCove
a810: 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
a820: 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
a830: 6f 20 74 68 65 20 73 74 61 74 31 20 74 61 62 6c  o the stat1 tabl
a840: 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 53 74  e. */.    callSt
a850: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
a860: 34 2c 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  4, STAT_GET_STAT
a870: 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20  1, regStat1);.  
a880: 20 20 61 73 73 65 72 74 28 20 22 42 42 42 22 5b    assert( "BBB"[
a890: 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  0]==SQLITE_AFF_T
a8a0: 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  EXT );.    sqlit
a8b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a8c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a8d0: 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65  egTabname, 3, re
a8e0: 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20 30 29  gTemp, "BBB", 0)
a8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a900: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
a910: 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72  wRowid, iStatCur
a920: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
a930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a940: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
a950: 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  rt, iStatCur, re
a960: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
a970: 69 64 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  id);.#ifdef SQLI
a980: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
a990: 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c  ATE_HOOK.    sql
a9a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
a9b0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
a9c0: 53 74 61 74 31 2c 20 50 34 5f 54 41 42 4c 45 29  Stat1, P4_TABLE)
a9d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a9e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
a9f0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
aa00: 44 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  D);..    /* Add 
aa10: 74 68 65 20 65 6e 74 72 69 65 73 20 74 6f 20 74  the entries to t
aa20: 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  he stat4 table. 
aa30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
aa40: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
aa50: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65    {.      int re
aa60: 67 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b 0a  gEq = regStat1;.
aa70: 20 20 20 20 20 20 69 6e 74 20 72 65 67 4c 74 20        int regLt 
aa80: 3d 20 72 65 67 53 74 61 74 31 2b 31 3b 0a 20 20  = regStat1+1;.  
aa90: 20 20 20 20 69 6e 74 20 72 65 67 44 4c 74 20 3d      int regDLt =
aaa0: 20 72 65 67 53 74 61 74 31 2b 32 3b 0a 20 20 20   regStat1+2;.   
aab0: 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c 65     int regSample
aac0: 20 3d 20 72 65 67 53 74 61 74 31 2b 33 3b 0a 20   = regStat1+3;. 
aad0: 20 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 20       int regCol 
aae0: 3d 20 72 65 67 53 74 61 74 31 2b 34 3b 0a 20 20  = regStat1+4;.  
aaf0: 20 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c      int regSampl
ab00: 65 52 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c 20  eRowid = regCol 
ab10: 2b 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e  + nCol;.      in
ab20: 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20 20  t addrNext;.    
ab30: 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c    int addrIsNull
ab40: 3b 0a 20 20 20 20 20 20 75 38 20 73 65 65 6b 4f  ;.      u8 seekO
ab50: 70 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61  p = HasRowid(pTa
ab60: 62 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73 74  b) ? OP_NotExist
ab70: 73 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b  s : OP_NotFound;
ab80: 0a 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ..      pParse->
ab90: 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73  nMem = MAX(pPars
aba0: 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f 6c 2b  e->nMem, regCol+
abb0: 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 20 20 61 64  nCol);..      ad
abc0: 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
abd0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
abe0: 76 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74  v);.      callSt
abf0: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
ac00: 34 2c 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49  4, STAT_GET_ROWI
ac10: 44 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69  D, regSampleRowi
ac20: 64 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 73  d);.      addrIs
ac30: 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
ac40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
ac50: 73 4e 75 6c 6c 2c 20 72 65 67 53 61 6d 70 6c 65  sNull, regSample
ac60: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64  Rowid);.      Vd
ac70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ac80: 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74       callStatGet
ac90: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
aca0: 41 54 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67 45  AT_GET_NEQ, regE
acb0: 71 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74  q);.      callSt
acc0: 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61 74  atGet(v, regStat
acd0: 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 2c  4, STAT_GET_NLT,
ace0: 20 72 65 67 4c 74 29 3b 0a 20 20 20 20 20 20 63   regLt);.      c
acf0: 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65  allStatGet(v, re
ad00: 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54  gStat4, STAT_GET
ad10: 5f 4e 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b 0a  _NDLT, regDLt);.
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad30: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 73 65  eAddOp4Int(v, se
ad40: 65 6b 4f 70 2c 20 69 54 61 62 43 75 72 2c 20 61  ekOp, iTabCur, a
ad50: 64 64 72 4e 65 78 74 2c 20 72 65 67 53 61 6d 70  ddrNext, regSamp
ad60: 6c 65 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  leRowid, 0);.   
ad70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ad80: 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  v);.      for(i=
ad90: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ada0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
adb0: 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
adc0: 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  xColumn(pParse, 
add0: 70 49 64 78 2c 20 69 54 61 62 43 75 72 2c 20 69  pIdx, iTabCur, i
ade0: 2c 20 72 65 67 43 6f 6c 2b 69 29 3b 0a 20 20 20  , regCol+i);.   
adf0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ae00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ae10: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
ae20: 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 72 65 67  egCol, nCol, reg
ae30: 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 73  Sample);.      s
ae40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ae50: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ae60: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36  d, regTabname, 6
ae70: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
ae80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae90: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
aea0: 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  id, iStatCur+1, 
aeb0: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
aec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aed0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
aee0: 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  rt, iStatCur+1, 
aef0: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
af00: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
af10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
af20: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64  , OP_Goto, 1, ad
af30: 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d  drNext); /* P1==
af40: 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  1 for end-of-loo
af50: 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  p */.      sqlit
af60: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
af70: 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20  , addrIsNull);. 
af80: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
af90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
afa0: 54 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 6e  T4 */..    /* En
afb0: 64 20 6f 66 20 61 6e 61 6c 79 73 69 73 20 2a 2f  d of analysis */
afc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
afd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
afe0: 52 65 77 69 6e 64 29 3b 0a 20 20 7d 0a 0a 0a 20  Rewind);.  }... 
aff0: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 73 69 6e   /* Create a sin
b000: 67 6c 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  gle sqlite_stat1
b010: 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e   entry containin
b020: 67 20 4e 55 4c 4c 20 61 73 20 74 68 65 20 69 6e  g NULL as the in
b030: 64 65 78 0a 20 20 2a 2a 20 6e 61 6d 65 20 61 6e  dex.  ** name an
b040: 64 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20  d the row count 
b050: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  as the content..
b060: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 6e 6c 79    */.  if( pOnly
b070: 49 64 78 3d 3d 30 20 26 26 20 6e 65 65 64 54 61  Idx==0 && needTa
b080: 62 6c 65 43 6e 74 20 29 7b 0a 20 20 20 20 56 64  bleCnt ){.    Vd
b090: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
b0a0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
b0b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b0c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
b0d0: 6f 75 6e 74 2c 20 69 54 61 62 43 75 72 2c 20 72  ount, iTabCur, r
b0e0: 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 6a 5a  egStat1);.    jZ
b0f0: 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74 65  eroRows = sqlite
b100: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b110: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61 74  P_IfNot, regStat
b120: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
b130: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
b140: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b150: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78  _Null, 0, regIdx
b160: 6e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  name);.    asser
b170: 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53 51 4c  t( "BBB"[0]==SQL
b180: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
b190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1a0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
b1b0: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
b1c0: 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c 20  me, 3, regTemp, 
b1d0: 22 42 42 42 22 2c 20 30 29 3b 0a 20 20 20 20 73  "BBB", 0);.    s
b1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b1f0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b200: 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65   iStatCur, regNe
b210: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
b220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b230: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
b240: 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c 20  atCur, regTemp, 
b250: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
b260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b270: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
b280: 41 50 50 45 4e 44 29 3b 0a 23 69 66 64 65 66 20  APPEND);.#ifdef 
b290: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
b2a0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20  EUPDATE_HOOK.   
b2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b2c0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
b2d0: 72 2a 29 70 53 74 61 74 31 2c 20 50 34 5f 54 41  r*)pStat1, P4_TA
b2e0: 42 4c 45 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  BLE);.#endif.   
b2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b300: 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f 52 6f 77  Here(v, jZeroRow
b310: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  s);.  }.}.../*.*
b320: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b330: 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20  that will cause 
b340: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
b350: 69 6e 64 65 78 20 61 6e 61 6c 79 73 69 73 20 74  index analysis t
b360: 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64 65 64 20 69  o.** be loaded i
b370: 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  nto internal has
b380: 68 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 69  h tables where i
b390: 73 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  s can be used..*
b3a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
b3b0: 61 64 41 6e 61 6c 79 73 69 73 28 50 61 72 73 65  adAnalysis(Parse
b3c0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
b3d0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
b3e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b3f0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
b400: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b410: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
b420: 6f 61 64 41 6e 61 6c 79 73 69 73 2c 20 69 44 62  oadAnalysis, iDb
b430: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b440: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
b450: 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e  at will do an an
b460: 61 6c 79 73 69 73 20 6f 66 20 61 6e 20 65 6e 74  alysis of an ent
b470: 69 72 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ire database.*/.
b480: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
b490: 79 7a 65 44 61 74 61 62 61 73 65 28 50 61 72 73  yzeDatabase(Pars
b4a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
b4b0: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
b4c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b4d0: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
b4e0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
b4f0: 5d 2e 70 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a  ].pSchema;    /*
b500: 20 53 63 68 65 6d 61 20 6f 66 20 64 61 74 61 62   Schema of datab
b510: 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 48 61 73  ase iDb */.  Has
b520: 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20  hElem *k;.  int 
b530: 69 53 74 61 74 43 75 72 3b 0a 20 20 69 6e 74 20  iStatCur;.  int 
b540: 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 54 61 62  iMem;.  int iTab
b550: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  ;..  sqlite3Begi
b560: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
b570: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
b580: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
b590: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50  arse->nTab;.  pP
b5a0: 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b  arse->nTab += 3;
b5b0: 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65  .  openStatTable
b5c0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53  (pParse, iDb, iS
b5d0: 74 61 74 43 75 72 2c 20 30 2c 20 30 29 3b 0a 20  tatCur, 0, 0);. 
b5e0: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
b5f0: 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54 61 62 20 3d  nMem+1;.  iTab =
b600: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
b610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b620: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
b630: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
b640: 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
b650: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
b660: 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d  >tblHash); k; k=
b670: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
b680: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
b690: 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
b6a0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
b6b0: 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54  .    analyzeOneT
b6c0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
b6d0: 62 2c 20 30 2c 20 69 53 74 61 74 43 75 72 2c 20  b, 0, iStatCur, 
b6e0: 69 4d 65 6d 2c 20 69 54 61 62 29 3b 0a 20 20 7d  iMem, iTab);.  }
b6f0: 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  .  loadAnalysis(
b700: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a  pParse, iDb);.}.
b710: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b720: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64  code that will d
b730: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
b740: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
b750: 69 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  in.** a database
b760: 2e 20 20 49 66 20 70 4f 6e 6c 79 49 64 78 20 69  .  If pOnlyIdx i
b770: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
b780: 69 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69  it is a single i
b790: 6e 64 65 78 0a 2a 2a 20 69 6e 20 70 54 61 62 20  ndex.** in pTab 
b7a0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 61  that should be a
b7b0: 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74  nalyzed..*/.stat
b7c0: 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 54  ic void analyzeT
b7d0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
b7e0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
b7f0: 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78   Index *pOnlyIdx
b800: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  ){.  int iDb;.  
b810: 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 0a 20  int iStatCur;.. 
b820: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
b830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b840: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
b850: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
b860: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d  ->db) );.  iDb =
b870: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
b880: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
b890: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
b8a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
b8b0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
b8c0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
b8d0: 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50 61    iStatCur = pPa
b8e0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61  rse->nTab;.  pPa
b8f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
b900: 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20 29    if( pOnlyIdx )
b910: 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61  {.    openStatTa
b920: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
b930: 20 69 53 74 61 74 43 75 72 2c 20 70 4f 6e 6c 79   iStatCur, pOnly
b940: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64 78  Idx->zName, "idx
b950: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
b960: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70   openStatTable(p
b970: 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61  Parse, iDb, iSta
b980: 74 43 75 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tCur, pTab->zNam
b990: 65 2c 20 22 74 62 6c 22 29 3b 0a 20 20 7d 0a 20  e, "tbl");.  }. 
b9a0: 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65   analyzeOneTable
b9b0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
b9c0: 4f 6e 6c 79 49 64 78 2c 20 69 53 74 61 74 43 75  OnlyIdx, iStatCu
b9d0: 72 2c 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  r,pParse->nMem+1
b9e0: 2c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  ,pParse->nTab);.
b9f0: 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70    loadAnalysis(p
ba00: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a  Parse, iDb);.}..
ba10: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ba20: 6f 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41 4c  ode for the ANAL
ba30: 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  YZE command.  Th
ba40: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
ba50: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
ba60: 68 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a 65  hen it recognize
ba70: 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f 6d  s an ANALYZE com
ba80: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
ba90: 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20 20     ANALYZE      
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
bac0: 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c 64       ANALYZE  <d
bad0: 61 74 61 62 61 73 65 3e 20 20 20 20 20 20 20 20  atabase>        
bae0: 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
baf0: 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20         ANALYZE  
bb00: 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
bb10: 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
bb20: 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
bb30: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
bb40: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
bb50: 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 61  atabases to be a
bb60: 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72 6d  nalyzed..** Form
bb70: 20 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20   2 analyzes all 
bb80: 69 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e 67  indices the sing
bb90: 6c 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  le database name
bba0: 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e 61  d..** Form 3 ana
bbb0: 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  lyzes all indice
bbc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
bbd0: 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
bbe0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
bbf0: 65 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65 20  e3Analyze(Parse 
bc00: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
bc10: 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
bc20: 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74 65  Name2){.  sqlite
bc30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bc40: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  db;.  int iDb;. 
bc50: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
bc60: 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65  z, *zDb;.  Table
bc70: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
bc80: 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a  *pIdx;.  Token *
bc90: 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 56 64  pTableName;.  Vd
bca0: 62 65 20 2a 76 3b 0a 0a 20 20 2f 2a 20 52 65 61  be *v;..  /* Rea
bcb0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
bcc0: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
bcd0: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
bce0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
bcf0: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
bd00: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
bd10: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
bd20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
bd30: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
bd40: 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20  xes(pParse->db) 
bd50: 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
bd60: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
bd70: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
bd80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bd90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ..  assert( pNam
bda0: 65 32 21 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d  e2!=0 || pName1=
bdb0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d  =0 );.  if( pNam
bdc0: 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  e1==0 ){.    /* 
bdd0: 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65  Form 1:  Analyze
bde0: 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20   everything */. 
bdf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
be00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
be10: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f     if( i==1 ) co
be20: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e  ntinue;  /* Do n
be30: 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 54  ot analyze the T
be40: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
be50: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74        analyzeDat
be60: 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 29  abase(pParse, i)
be70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
be80: 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
be90: 20 26 26 20 28 69 44 62 20 3d 20 73 71 6c 69 74   && (iDb = sqlit
bea0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
beb0: 6d 65 31 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  me1))>=0 ){.    
bec0: 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 73  /* Analyze the s
bed0: 63 68 65 6d 61 20 6e 61 6d 65 64 20 61 73 20 74  chema named as t
bee0: 68 65 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  he argument */. 
bef0: 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61     analyzeDataba
bf00: 73 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  se(pParse, iDb);
bf10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
bf20: 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65   Form 3: Analyze
bf30: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
bf40: 64 65 78 20 6e 61 6d 65 64 20 61 73 20 61 6e 20  dex named as an 
bf50: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  argument */.    
bf60: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
bf70: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
bf80: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
bf90: 20 26 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20   &pTableName);. 
bfa0: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b     if( iDb>=0 ){
bfb0: 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 70 4e 61  .      zDb = pNa
bfc0: 6d 65 32 2d 3e 6e 20 3f 20 64 62 2d 3e 61 44 62  me2->n ? db->aDb
bfd0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
bfe0: 20 30 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   0;.      z = sq
bff0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
c000: 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  en(db, pTableNam
c010: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  e);.      if( z 
c020: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
c030: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
c040: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
c050: 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Db))!=0 ){.     
c060: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
c070: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
c080: 70 54 61 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20  pTable, pIdx);. 
c090: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
c0a0: 20 28 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33   (pTab = sqlite3
c0b0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
c0c0: 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62 29 29 21  se, 0, z, zDb))!
c0d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c0e0: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
c0f0: 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
c100: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c120: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, z);.      }. 
c130: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 64     }.  }.  if( d
c140: 62 2d 3e 6e 53 71 6c 45 78 65 63 3d 3d 30 20 26  b->nSqlExec==0 &
c150: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
c160: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
c170: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c180: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c190: 5f 45 78 70 69 72 65 29 3b 0a 20 20 7d 0a 7d 0a  _Expire);.  }.}.
c1a0: 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70  ./*.** Used to p
c1b0: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
c1c0: 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a 65  from the analyze
c1d0: 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67 68  r reader through
c1e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 62   to the.** callb
c1f0: 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  ack routine..*/.
c200: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
c210: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61 6c  nalysisInfo anal
c220: 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ysisInfo;.struct
c230: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b 0a   analysisInfo {.
c240: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
c260: 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  tabase;.};../*.*
c270: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
c280: 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  ment points to a
c290: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
c2a0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
c2b0: 67 20 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 73  g a.** list of s
c2c0: 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20 69  pace separated i
c2d0: 6e 74 65 67 65 72 73 2e 20 52 65 61 64 20 74 68  ntegers. Read th
c2e0: 65 20 66 69 72 73 74 20 6e 4f 75 74 20 6f 66 20  e first nOut of 
c2f0: 74 68 65 73 65 20 69 6e 74 6f 0a 2a 2a 20 74 68  these into.** th
c300: 65 20 61 72 72 61 79 20 61 4f 75 74 5b 5d 2e 0a  e array aOut[]..
c310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
c320: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20  ecodeIntArray(. 
c330: 20 63 68 61 72 20 2a 7a 49 6e 74 41 72 72 61 79   char *zIntArray
c340: 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e  ,       /* Strin
c350: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 74  g containing int
c360: 20 61 72 72 61 79 20 74 6f 20 64 65 63 6f 64 65   array to decode
c370: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c390: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
c3a0: 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f 0a 20 20 74  in aOut[] */.  t
c3b0: 52 6f 77 63 6e 74 20 2a 61 4f 75 74 2c 20 20 20  Rowcnt *aOut,   
c3c0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 69        /* Store i
c3d0: 6e 74 65 67 65 72 73 20 68 65 72 65 20 2a 2f 0a  ntegers here */.
c3e0: 20 20 4c 6f 67 45 73 74 20 2a 61 4c 6f 67 2c 20    LogEst *aLog, 
c3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 2c 20           /* Or, 
c400: 69 66 20 61 4f 75 74 3d 3d 30 2c 20 68 65 72 65  if aOut==0, here
c410: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
c420: 64 65 78 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dex          /* 
c430: 48 61 6e 64 6c 65 20 65 78 74 72 61 20 66 6c 61  Handle extra fla
c440: 67 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  gs for this inde
c450: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
c460: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  /.){.  char *z =
c470: 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20 20 69 6e   zIntArray;.  in
c480: 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t c;.  int i;.  
c490: 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 23 69 66 64  tRowcnt v;..#ifd
c4a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c4b0: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d  _STAT4.  if( z==
c4c0: 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73  0 ) z = "";.#els
c4d0: 65 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  e.  assert( z!=0
c4e0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72   );.#endif.  for
c4f0: 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f  (i=0; *z && i<nO
c500: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20  ut; i++){.    v 
c510: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
c520: 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26  (c=z[0])>='0' &&
c530: 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20   c<='9' ){.     
c540: 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20   v = v*10 + c - 
c550: 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  '0';.      z++;.
c560: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
c570: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
c580: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 20 29 20  .    if( aOut ) 
c590: 61 4f 75 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20  aOut[i] = v;.   
c5a0: 20 69 66 28 20 61 4c 6f 67 20 29 20 61 4c 6f 67   if( aLog ) aLog
c5b0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  [i] = sqlite3Log
c5c0: 45 73 74 28 76 29 3b 0a 23 65 6c 73 65 0a 20 20  Est(v);.#else.  
c5d0: 20 20 61 73 73 65 72 74 28 20 61 4f 75 74 3d 3d    assert( aOut==
c5e0: 30 20 29 3b 0a 20 20 20 20 55 4e 55 53 45 44 5f  0 );.    UNUSED_
c5f0: 50 41 52 41 4d 45 54 45 52 28 61 4f 75 74 29 3b  PARAMETER(aOut);
c600: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4c 6f  .    assert( aLo
c610: 67 21 3d 30 20 29 3b 0a 20 20 20 20 61 4c 6f 67  g!=0 );.    aLog
c620: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  [i] = sqlite3Log
c630: 45 73 74 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20  Est(v);.#endif. 
c640: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29     if( *z==' ' )
c650: 20 7a 2b 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65   z++;.  }.#ifnde
c660: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c670: 53 54 41 54 34 0a 20 20 61 73 73 65 72 74 28 20  STAT4.  assert( 
c680: 70 49 6e 64 65 78 21 3d 30 20 29 3b 20 7b 0a 23  pIndex!=0 ); {.#
c690: 65 6c 73 65 0a 20 20 69 66 28 20 70 49 6e 64 65  else.  if( pInde
c6a0: 78 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  x ){.#endif.    
c6b0: 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
c6c0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 64  ed = 0;.    pInd
c6d0: 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d  ex->noSkipScan =
c6e0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
c6f0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  [0] ){.      if(
c700: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
c710: 28 22 75 6e 6f 72 64 65 72 65 64 2a 22 2c 20 7a  ("unordered*", z
c720: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c730: 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
c740: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ed = 1;.      }e
c750: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
c760: 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30 2d 39  strglob("sz=[0-9
c770: 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  ]*", z)==0 ){.  
c780: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73        int sz = s
c790: 71 6c 69 74 65 33 41 74 6f 69 28 7a 2b 33 29 3b  qlite3Atoi(z+3);
c7a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3c  .        if( sz<
c7b0: 32 20 29 20 73 7a 20 3d 20 32 3b 0a 20 20 20 20  2 ) sz = 2;.    
c7c0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49 64      pIndex->szId
c7d0: 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  xRow = sqlite3Lo
c7e0: 67 45 73 74 28 73 7a 29 3b 0a 20 20 20 20 20 20  gEst(sz);.      
c7f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
c800: 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 73 6b 69  3_strglob("noski
c810: 70 73 63 61 6e 2a 22 2c 20 7a 29 3d 3d 30 20 29  pscan*", z)==0 )
c820: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
c830: 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20 31  ->noSkipScan = 1
c840: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
c850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c860: 4f 53 54 4d 55 4c 54 0a 20 20 20 20 20 20 65 6c  OSTMULT.      el
c870: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  se if( sqlite3_s
c880: 74 72 67 6c 6f 62 28 22 63 6f 73 74 6d 75 6c 74  trglob("costmult
c890: 3d 5b 30 2d 39 5d 2a 22 2c 7a 29 3d 3d 30 20 29  =[0-9]*",z)==0 )
c8a0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
c8b0: 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75  ->pTable->costMu
c8c0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  lt = sqlite3LogE
c8d0: 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  st(sqlite3Atoi(z
c8e0: 2b 39 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  +9));.      }.#e
c8f0: 6e 64 69 66 0a 20 20 20 20 20 20 77 68 69 6c 65  ndif.      while
c900: 28 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b 30  ( z[0]!=0 && z[0
c910: 5d 21 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]!=' ' ) z++;.  
c920: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d      while( z[0]=
c930: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  =' ' ) z++;.    
c940: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
c950: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  his callback is 
c960: 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
c970: 20 65 61 63 68 20 69 6e 64 65 78 20 77 68 65 6e   each index when
c980: 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
c990: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
c9a0: 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20  le.  .**.**     
c9b0: 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f  argv[0] = name o
c9c0: 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
c9d0: 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e 61 6d     argv[1] = nam
c9e0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 28  e of the index (
c9f0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 29 0a 2a  might be NULL).*
ca00: 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20  *     argv[2] = 
ca10: 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79  results of analy
ca20: 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72  sis - on integer
ca30: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
ca40: 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20 66  .**.** Entries f
ca50: 6f 72 20 77 68 69 63 68 20 61 72 67 76 5b 31 5d  or which argv[1]
ca60: 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  ==NULL simply re
ca70: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
ca80: 6f 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20 74 68  of rows in.** th
ca90: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
caa0: 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c  ic int analysisL
cab0: 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61 74  oader(void *pDat
cac0: 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  a, int argc, cha
cad0: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
cae0: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e 61  *NotUsed){.  ana
caf0: 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f  lysisInfo *pInfo
cb00: 20 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f   = (analysisInfo
cb10: 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e 64 65 78  *)pData;.  Index
cb20: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61 62 6c   *pIndex;.  Tabl
cb30: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  e *pTable;.  con
cb40: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  st char *z;..  a
cb50: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29  ssert( argc==3 )
cb60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
cb70: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61  ETER2(NotUsed, a
cb80: 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  rgc);..  if( arg
cb90: 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d  v==0 || argv[0]=
cba0: 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30  =0 || argv[2]==0
cbb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cbc0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
cbd0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
cbe0: 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67  e(pInfo->db, arg
cbf0: 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61  v[0], pInfo->zDa
cc00: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
cc10: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
cc20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cc30: 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29  if( argv[1]==0 )
cc40: 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  {.    pIndex = 0
cc50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
cc60: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 72  lite3_stricmp(ar
cc70: 67 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d  gv[0],argv[1])==
cc80: 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20  0 ){.    pIndex 
cc90: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
cca0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 6c 65 29  KeyIndex(pTable)
ccb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ccc0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
ccd0: 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e  indIndex(pInfo->
cce0: 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49 6e  db, argv[1], pIn
ccf0: 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  fo->zDatabase);.
cd00: 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 32    }.  z = argv[2
cd10: 5d 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ];..  if( pIndex
cd20: 20 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   ){.    tRowcnt 
cd30: 2a 61 69 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20  *aiRowEst = 0;. 
cd40: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49     int nCol = pI
cd50: 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b  ndex->nKeyCol+1;
cd60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cd70: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20  NABLE_STAT4.    
cd80: 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
cd90: 74 20 6d 61 79 20 61 6c 72 65 61 64 79 20 62 65  t may already be
cda0: 20 73 65 74 20 68 65 72 65 20 69 66 20 74 68 65   set here if the
cdb0: 72 65 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  re are duplicate
cdc0: 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f   .    ** sqlite_
cdd0: 73 74 61 74 31 20 65 6e 74 72 69 65 73 20 66 6f  stat1 entries fo
cde0: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 20 49 6e  r this index. In
cdf0: 20 74 68 61 74 20 63 61 73 65 20 6a 75 73 74 20   that case just 
ce00: 63 6c 6f 62 62 65 72 0a 20 20 20 20 2a 2a 20 74  clobber.    ** t
ce10: 68 65 20 6f 6c 64 20 64 61 74 61 20 77 69 74 68  he old data with
ce20: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 65 61 64   the new instead
ce30: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   of allocating a
ce40: 20 6e 65 77 20 61 72 72 61 79 2e 20 20 2a 2f 0a   new array.  */.
ce50: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
ce60: 61 69 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20  aiRowEst==0 ){. 
ce70: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 52       pIndex->aiR
ce80: 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74  owEst = (tRowcnt
ce90: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
cea0: 65 72 6f 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  ero(sizeof(tRowc
ceb0: 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 20  nt) * nCol);.   
cec0: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
ced0: 69 52 6f 77 45 73 74 3d 3d 30 20 29 20 73 71 6c  iRowEst==0 ) sql
cee0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 49 6e  ite3OomFault(pIn
cef0: 66 6f 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  fo->db);.    }. 
cf00: 20 20 20 61 69 52 6f 77 45 73 74 20 3d 20 70 49     aiRowEst = pI
cf10: 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  ndex->aiRowEst;.
cf20: 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64 65  #endif.    pInde
cf30: 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d 20  x->bUnordered = 
cf40: 30 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  0;.    decodeInt
cf50: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
cf60: 6e 43 6f 6c 2c 20 61 69 52 6f 77 45 73 74 2c 20  nCol, aiRowEst, 
cf70: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67  pIndex->aiRowLog
cf80: 45 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  Est, pIndex);.  
cf90: 20 20 70 49 6e 64 65 78 2d 3e 68 61 73 53 74 61    pIndex->hasSta
cfa0: 74 31 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  t1 = 1;.    if( 
cfb0: 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
cfc0: 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
cfd0: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
cfe0: 67 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e 61  gEst = pIndex->a
cff0: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
d000: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62       pTable->tab
d010: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53  Flags |= TF_HasS
d020: 74 61 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  tat1;.    }.  }e
d030: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 66  lse{.    Index f
d040: 61 6b 65 49 64 78 3b 0a 20 20 20 20 66 61 6b 65  akeIdx;.    fake
d050: 49 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  Idx.szIdxRow = p
d060: 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 3b  Table->szTabRow;
d070: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d080: 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20  NABLE_COSTMULT. 
d090: 20 20 20 66 61 6b 65 49 64 78 2e 70 54 61 62 6c     fakeIdx.pTabl
d0a0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 23 65 6e 64  e = pTable;.#end
d0b0: 69 66 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  if.    decodeInt
d0c0: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
d0d0: 31 2c 20 30 2c 20 26 70 54 61 62 6c 65 2d 3e 6e  1, 0, &pTable->n
d0e0: 52 6f 77 4c 6f 67 45 73 74 2c 20 26 66 61 6b 65  RowLogEst, &fake
d0f0: 49 64 78 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Idx);.    pTable
d100: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 66 61 6b  ->szTabRow = fak
d110: 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 3b 0a 20  eIdx.szIdxRow;. 
d120: 20 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c     pTable->tabFl
d130: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 53 74 61  ags |= TF_HasSta
d140: 74 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t1;.  }..  retur
d150: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
d160: 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70   the Index.aSamp
d170: 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  le variable is n
d180: 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20  ot NULL, delete 
d190: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
d1a0: 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63  ray.** and its c
d1b0: 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  ontents..*/.void
d1c0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
d1d0: 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74  dexSamples(sqlit
d1e0: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
d1f0: 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Idx){.#ifdef SQL
d200: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
d210: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61  .  if( pIdx->aSa
d220: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  mple ){.    int 
d230: 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  j;.    for(j=0; 
d240: 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  j<pIdx->nSample;
d250: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64   j++){.      Ind
d260: 65 78 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70  exSample *p = &p
d270: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b  Idx->aSample[j];
d280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
d290: 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a  Free(db, p->p);.
d2a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d2b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
d2c0: 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a  ->aSample);.  }.
d2d0: 20 20 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e    if( db && db->
d2e0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
d2f0: 29 7b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61  ){.    pIdx->nSa
d300: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  mple = 0;.    pI
d310: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->aSample = 0;
d320: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
d330: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
d340: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
d350: 4d 45 54 45 52 28 70 49 64 78 29 3b 0a 23 65 6e  METER(pIdx);.#en
d360: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
d370: 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a  ABLE_STAT4 */.}.
d380: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d390: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a  NABLE_STAT4./*.*
d3a0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
d3b0: 49 64 78 2d 3e 61 41 76 67 45 71 5b 5d 20 61 72  Idx->aAvgEq[] ar
d3c0: 72 61 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ray based on the
d3d0: 20 73 61 6d 70 6c 65 73 20 63 75 72 72 65 6e 74   samples current
d3e0: 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ly.** stored in 
d3f0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e  pIdx->aSample[].
d400: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
d410: 20 69 6e 69 74 41 76 67 45 71 28 49 6e 64 65 78   initAvgEq(Index
d420: 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70   *pIdx){.  if( p
d430: 49 64 78 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  Idx ){.    Index
d440: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
d450: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
d460: 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  .    IndexSample
d470: 20 2a 70 46 69 6e 61 6c 20 3d 20 26 61 53 61 6d   *pFinal = &aSam
d480: 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ple[pIdx->nSampl
d490: 65 2d 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43  e-1];.    int iC
d4a0: 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c  ol;.    int nCol
d4b0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 49   = 1;.    if( pI
d4c0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3e 31  dx->nSampleCol>1
d4d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
d4e0: 74 68 69 73 20 69 73 20 73 74 61 74 34 20 64 61  this is stat4 da
d4f0: 74 61 2c 20 74 68 65 6e 20 63 61 6c 63 75 6c 61  ta, then calcula
d500: 74 65 20 61 41 76 67 45 71 5b 5d 20 76 61 6c 75  te aAvgEq[] valu
d510: 65 73 20 66 6f 72 20 61 6c 6c 0a 20 20 20 20 20  es for all.     
d520: 20 2a 2a 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d   ** sample colum
d530: 6e 73 20 65 78 63 65 70 74 20 74 68 65 20 6c 61  ns except the la
d540: 73 74 2e 20 54 68 65 20 6c 61 73 74 20 69 73 20  st. The last is 
d550: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 31 2c  always set to 1,
d560: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63   as.      ** onc
d570: 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 50  e the trailing P
d580: 4b 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6e  K fields are con
d590: 73 69 64 65 72 65 64 20 61 6c 6c 20 69 6e 64 65  sidered all inde
d5a0: 78 20 6b 65 79 73 20 61 72 65 0a 20 20 20 20 20  x keys are.     
d5b0: 20 2a 2a 20 75 6e 69 71 75 65 2e 20 20 2a 2f 0a   ** unique.  */.
d5c0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64        nCol = pId
d5d0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 2d 31 3b  x->nSampleCol-1;
d5e0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41 76  .      pIdx->aAv
d5f0: 67 45 71 5b 6e 43 6f 6c 5d 20 3d 20 31 3b 0a 20  gEq[nCol] = 1;. 
d600: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 43 6f     }.    for(iCo
d610: 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20  l=0; iCol<nCol; 
d620: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
d630: 6e 74 20 6e 53 61 6d 70 6c 65 20 3d 20 70 49 64  nt nSample = pId
d640: 78 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->nSample;.    
d650: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d670: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
d680: 68 72 6f 75 67 68 20 73 61 6d 70 6c 65 73 20 2a  hrough samples *
d690: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
d6a0: 73 75 6d 45 71 20 3d 20 30 3b 20 20 20 20 20 20  sumEq = 0;      
d6b0: 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65 20    /* Sum of the 
d6c0: 6e 45 71 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  nEq values */.  
d6d0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 76 67 45      tRowcnt avgE
d6e0: 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 52 6f  q = 0;.      tRo
d6f0: 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20  wcnt nRow;      
d700: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d710: 20 6f 66 20 72 6f 77 73 20 69 6e 20 69 6e 64 65   of rows in inde
d720: 78 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 6e  x */.      i64 n
d730: 53 75 6d 31 30 30 20 3d 20 30 3b 20 20 20 20 20  Sum100 = 0;     
d740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d750: 66 20 74 65 72 6d 73 20 63 6f 6e 74 72 69 62 75  f terms contribu
d760: 74 69 6e 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f  ting to sumEq */
d770: 0a 20 20 20 20 20 20 69 36 34 20 6e 44 69 73 74  .      i64 nDist
d780: 31 30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  100;            
d790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
d7a0: 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 69 6e  stinct values in
d7b0: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 20   index */..     
d7c0: 20 69 66 28 20 21 70 49 64 78 2d 3e 61 69 52 6f   if( !pIdx->aiRo
d7d0: 77 45 73 74 20 7c 7c 20 69 43 6f 6c 3e 3d 70 49  wEst || iCol>=pI
d7e0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 70  dx->nKeyCol || p
d7f0: 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43  Idx->aiRowEst[iC
d800: 6f 6c 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ol+1]==0 ){.    
d810: 20 20 20 20 6e 52 6f 77 20 3d 20 70 46 69 6e 61      nRow = pFina
d820: 6c 2d 3e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  l->anLt[iCol];. 
d830: 20 20 20 20 20 20 20 6e 44 69 73 74 31 30 30 20         nDist100 
d840: 3d 20 28 69 36 34 29 31 30 30 20 2a 20 70 46 69  = (i64)100 * pFi
d850: 6e 61 6c 2d 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d  nal->anDLt[iCol]
d860: 3b 0a 20 20 20 20 20 20 20 20 6e 53 61 6d 70 6c  ;.        nSampl
d870: 65 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e--;.      }else
d880: 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d  {.        nRow =
d890: 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b   pIdx->aiRowEst[
d8a0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 6e 44 69 73  0];.        nDis
d8b0: 74 31 30 30 20 3d 20 28 28 69 36 34 29 31 30 30  t100 = ((i64)100
d8c0: 20 2a 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   * pIdx->aiRowEs
d8d0: 74 5b 30 5d 29 20 2f 20 70 49 64 78 2d 3e 61 69  t[0]) / pIdx->ai
d8e0: 52 6f 77 45 73 74 5b 69 43 6f 6c 2b 31 5d 3b 0a  RowEst[iCol+1];.
d8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
d900: 64 78 2d 3e 6e 52 6f 77 45 73 74 30 20 3d 20 6e  dx->nRowEst0 = n
d910: 52 6f 77 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  Row;..      /* S
d920: 65 74 20 6e 53 75 6d 20 74 6f 20 74 68 65 20 6e  et nSum to the n
d930: 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
d940: 74 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  t (iCol+1) field
d950: 20 70 72 65 66 69 78 65 73 20 74 68 61 74 0a 20   prefixes that. 
d960: 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 69 6e       ** occur in
d970: 20 74 68 65 20 73 74 61 74 34 20 74 61 62 6c 65   the stat4 table
d980: 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e   for this index.
d990: 20 53 65 74 20 73 75 6d 45 71 20 74 6f 20 74 68   Set sumEq to th
d9a0: 65 20 73 75 6d 20 6f 66 20 0a 20 20 20 20 20 20  e sum of .      
d9b0: 2a 2a 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  ** the nEq value
d9c0: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
d9d0: 6c 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 73  l for the same s
d9e0: 65 74 20 28 61 64 64 69 6e 67 20 74 68 65 20 76  et (adding the v
d9f0: 61 6c 75 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  alue .      ** o
da00: 6e 6c 79 20 6f 6e 63 65 20 77 68 65 72 65 20 74  nly once where t
da10: 68 65 72 65 20 65 78 69 73 74 20 64 75 70 6c 69  here exist dupli
da20: 63 61 74 65 20 70 72 65 66 69 78 65 73 29 2e 20  cate prefixes). 
da30: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
da40: 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b  0; i<nSample; i+
da50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
da60: 69 3d 3d 28 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  i==(pIdx->nSampl
da70: 65 2d 31 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  e-1).         ||
da80: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c   aSample[i].anDL
da90: 74 5b 69 43 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65  t[iCol]!=aSample
daa0: 5b 69 2b 31 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c  [i+1].anDLt[iCol
dab0: 5d 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ] .        ){.  
dac0: 20 20 20 20 20 20 20 20 73 75 6d 45 71 20 2b 3d          sumEq +=
dad0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
dae0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
daf0: 20 20 6e 53 75 6d 31 30 30 20 2b 3d 20 31 30 30    nSum100 += 100
db00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db10: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
db20: 44 69 73 74 31 30 30 3e 6e 53 75 6d 31 30 30 20  Dist100>nSum100 
db30: 26 26 20 73 75 6d 45 71 3c 6e 52 6f 77 20 29 7b  && sumEq<nRow ){
db40: 0a 20 20 20 20 20 20 20 20 61 76 67 45 71 20 3d  .        avgEq =
db50: 20 28 28 69 36 34 29 31 30 30 20 2a 20 28 6e 52   ((i64)100 * (nR
db60: 6f 77 20 2d 20 73 75 6d 45 71 29 29 2f 28 6e 44  ow - sumEq))/(nD
db70: 69 73 74 31 30 30 20 2d 20 6e 53 75 6d 31 30 30  ist100 - nSum100
db80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
db90: 20 69 66 28 20 61 76 67 45 71 3d 3d 30 20 29 20   if( avgEq==0 ) 
dba0: 61 76 67 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  avgEq = 1;.     
dbb0: 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
dbc0: 6f 6c 5d 20 3d 20 61 76 67 45 71 3b 0a 20 20 20  ol] = avgEq;.   
dbd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
dbe0: 4c 6f 6f 6b 20 75 70 20 61 6e 20 69 6e 64 65 78  Look up an index
dbf0: 20 62 79 20 6e 61 6d 65 2e 20 20 4f 72 2c 20 69   by name.  Or, i
dc00: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  f the name of a 
dc10: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
dc20: 62 6c 65 0a 2a 2a 20 69 73 20 73 75 70 70 6c 69  ble.** is suppli
dc30: 65 64 20 69 6e 73 74 65 61 64 2c 20 66 69 6e 64  ed instead, find
dc40: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dc50: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20   index for that 
dc60: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
dc70: 20 49 6e 64 65 78 20 2a 66 69 6e 64 49 6e 64 65   Index *findInde
dc80: 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  xOrPrimaryKey(. 
dc90: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
dcb0: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
dcc0: 2a 7a 44 62 0a 29 7b 0a 20 20 49 6e 64 65 78 20  *zDb.){.  Index 
dcd0: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46  *pIdx = sqlite3F
dce0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
dcf0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  me, zDb);.  if( 
dd00: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 54  pIdx==0 ){.    T
dd10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
dd20: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
dd30: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
dd40: 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21     if( pTab && !
dd50: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
dd60: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 50   pIdx = sqlite3P
dd70: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
dd80: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Tab);.  }.  retu
dd90: 72 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pIdx;.}../*.*
dda0: 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  * Load the conte
ddb0: 6e 74 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  nt from either t
ddc0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a  he sqlite_stat4.
ddd0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 6c 65  ** into the rele
dde0: 76 61 6e 74 20 49 6e 64 65 78 2e 61 53 61 6d 70  vant Index.aSamp
ddf0: 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a  le[] arrays..**.
de00: 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 7a 53 71  ** Arguments zSq
de10: 6c 31 20 61 6e 64 20 7a 53 71 6c 32 20 6d 75 73  l1 and zSql2 mus
de20: 74 20 70 6f 69 6e 74 20 74 6f 20 53 51 4c 20 73  t point to SQL s
de30: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 72  tatements that r
de40: 65 74 75 72 6e 0a 2a 2a 20 64 61 74 61 20 65 71  eturn.** data eq
de50: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
de60: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
de70: 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c 45 43      zSql1: SELEC
de80: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
de90: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
dea0: 61 74 34 20 47 52 4f 55 50 20 42 59 20 69 64 78  at4 GROUP BY idx
deb0: 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20 53 45  .**    zSql2: SE
dec0: 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74  LECT idx,neq,nlt
ded0: 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f  ,ndlt,sample FRO
dee0: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
def0: 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 25 51  4.**.** where %Q
df00: 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74   is replaced wit
df10: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
df20: 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 53  ame before the S
df30: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  QL is executed..
df40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
df50: 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73 71 6c  adStatTbl(.  sql
df60: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
df70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
df80: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
df90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dfa0: 53 71 6c 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sql1,           
dfb0: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
dfc0: 74 20 31 20 28 73 65 65 20 61 62 6f 76 65 29 20  t 1 (see above) 
dfd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dfe0: 2a 7a 53 71 6c 32 2c 20 20 20 20 20 20 20 20 20  *zSql2,         
dff0: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
e000: 65 6e 74 20 32 20 28 73 65 65 20 61 62 6f 76 65  ent 2 (see above
e010: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ) */.  const cha
e020: 72 20 2a 7a 44 62 20 20 20 20 20 20 20 20 20 20  r *zDb          
e030: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e040: 20 6e 61 6d 65 20 28 65 2e 67 2e 20 22 6d 61 69   name (e.g. "mai
e050: 6e 22 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n") */.){.  int 
e060: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
e070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
e080: 75 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73  ult codes from s
e090: 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
e0a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
e0b0: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  tmt = 0;      /*
e0c0: 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
e0d0: 74 20 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a 20  t being run */. 
e0e0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e100: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51  * Text of the SQ
e110: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
e120: 20 49 6e 64 65 78 20 2a 70 50 72 65 76 49 64 78   Index *pPrevIdx
e130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
e140: 2a 20 50 72 65 76 69 6f 75 73 20 69 6e 64 65 78  * Previous index
e150: 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   in the loop */.
e160: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70    IndexSample *p
e170: 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20  Sample;         
e180: 2f 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70 49 64  /* A slot in pId
e190: 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a  x->aSample[] */.
e1a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
e1b0: 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
e1c0: 65 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  e );.  zSql = sq
e1d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e1e0: 20 7a 53 71 6c 31 2c 20 7a 44 62 29 3b 0a 20 20   zSql1, zDb);.  
e1f0: 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
e200: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e210: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
e220: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
e230: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
e240: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
e250: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e260: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  db, zSql);.  if(
e270: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e280: 0a 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ..  while( sqlit
e290: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
e2a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
e2b0: 20 20 69 6e 74 20 6e 49 64 78 43 6f 6c 20 3d 20    int nIdxCol = 
e2c0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
e2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
e2e0: 75 6d 6e 73 20 69 6e 20 73 74 61 74 34 20 72 65  umns in stat4 re
e2f0: 63 6f 72 64 73 20 2a 2f 0a 0a 20 20 20 20 63 68  cords */..    ch
e300: 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a  ar *zIndex;   /*
e310: 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20   Index name */. 
e320: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
e330: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
e340: 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63   the index objec
e350: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61  t */.    int nSa
e360: 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62  mple;    /* Numb
e370: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f  er of samples */
e380: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
e390: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e3a0: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
e3b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
e3c0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e3d0: 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65  of space require
e3e0: 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74  d */.    tRowcnt
e3f0: 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a   *pSpace;..    z
e400: 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29  Index = (char *)
e410: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e420: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
e430: 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30     if( zIndex==0
e440: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e450: 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74   nSample = sqlit
e460: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
e470: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70 49 64  tmt, 1);.    pId
e480: 78 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50  x = findIndexOrP
e490: 72 69 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49  rimaryKey(db, zI
e4a0: 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ndex, zDb);.    
e4b0: 61 73 73 65 72 74 28 20 70 49 64 78 3d 3d 30 20  assert( pIdx==0 
e4c0: 7c 7c 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  || pIdx->nSample
e4d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
e4e0: 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Idx==0 ) continu
e4f0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e;.    assert( !
e500: 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
e510: 54 61 62 6c 65 29 20 7c 7c 20 70 49 64 78 2d 3e  Table) || pIdx->
e520: 6e 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 6e  nColumn==pIdx->n
e530: 4b 65 79 43 6f 6c 2b 31 20 29 3b 0a 20 20 20 20  KeyCol+1 );.    
e540: 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  if( !HasRowid(pI
e550: 64 78 2d 3e 70 54 61 62 6c 65 29 20 26 26 20 49  dx->pTable) && I
e560: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
e570: 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
e580: 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nIdxCol = pIdx->
e590: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 7d 65 6c  nKeyCol;.    }el
e5a0: 73 65 7b 0a 20 20 20 20 20 20 6e 49 64 78 43 6f  se{.      nIdxCo
e5b0: 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
e5c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64  n;.    }.    pId
e5d0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 3d 20  x->nSampleCol = 
e5e0: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 6e 42 79  nIdxCol;.    nBy
e5f0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65  te = sizeof(Inde
e600: 78 53 61 6d 70 6c 65 29 20 2a 20 6e 53 61 6d 70  xSample) * nSamp
e610: 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d  le;.    nByte +=
e620: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
e630: 20 2a 20 6e 49 64 78 43 6f 6c 20 2a 20 33 20 2a   * nIdxCol * 3 *
e640: 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42   nSample;.    nB
e650: 79 74 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 20 2a  yte += nIdxCol *
e660: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
e670: 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66  ;     /* Space f
e680: 6f 72 20 49 6e 64 65 78 2e 61 41 76 67 45 71 5b  or Index.aAvgEq[
e690: 5d 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 2d 3e  ] */..    pIdx->
e6a0: 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65  aSample = sqlite
e6b0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e6c0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
e6d0: 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3d  ( pIdx->aSample=
e6e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e6f0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
e700: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
e710: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
e720: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
e730: 53 70 61 63 65 20 3d 20 28 74 52 6f 77 63 6e 74  Space = (tRowcnt
e740: 2a 29 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  *)&pIdx->aSample
e750: 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 70  [nSample];.    p
e760: 49 64 78 2d 3e 61 41 76 67 45 71 20 3d 20 70 53  Idx->aAvgEq = pS
e770: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
e780: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 66 6f 72  nIdxCol;.    for
e790: 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b  (i=0; i<nSample;
e7a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
e7b0: 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e  x->aSample[i].an
e7c0: 45 71 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70  Eq = pSpace; pSp
e7d0: 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a  ace += nIdxCol;.
e7e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d        pIdx->aSam
e7f0: 70 6c 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70 53  ple[i].anLt = pS
e800: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
e810: 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70  nIdxCol;.      p
e820: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  Idx->aSample[i].
e830: 61 6e 44 4c 74 20 3d 20 70 53 70 61 63 65 3b 20  anDLt = pSpace; 
e840: 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f  pSpace += nIdxCo
e850: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  l;.    }.    ass
e860: 65 72 74 28 20 28 28 75 38 2a 29 70 53 70 61 63  ert( ((u8*)pSpac
e870: 65 29 2d 6e 42 79 74 65 3d 3d 28 75 38 2a 29 28  e)-nByte==(u8*)(
e880: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 20 29  pIdx->aSample) )
e890: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e8a0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
e8b0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tmt);.  if( rc )
e8c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a   return rc;..  z
e8d0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
e8e0: 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 32 2c 20  intf(db, zSql2, 
e8f0: 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a 53 71  zDb);.  if( !zSq
e900: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
e910: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
e920: 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  T;.  }.  rc = sq
e930: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
e940: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
e950: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
e960: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
e970: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
e980: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
e990: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
e9a0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
e9b0: 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  OW ){.    char *
e9c0: 7a 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  zIndex;         
e9d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e9e0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
e9f0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
ea00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
ea10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64  inter to the ind
ea20: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ex object */.   
ea30: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20 20   int nCol = 1;  
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
ea60: 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  mns in index */.
ea70: 0a 20 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63  .    zIndex = (c
ea80: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
ea90: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
eaa0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e   0);.    if( zIn
eab0: 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dex==0 ) continu
eac0: 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  e;.    pIdx = fi
ead0: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
eae0: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
eaf0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
eb00: 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dx==0 ) continue
eb10: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6e 65  ;.    /* This ne
eb20: 78 74 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  xt condition is 
eb30: 74 72 75 65 20 69 66 20 64 61 74 61 20 68 61 73  true if data has
eb40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f   already been lo
eb50: 61 64 65 64 20 66 72 6f 6d 20 0a 20 20 20 20 2a  aded from .    *
eb60: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * the sqlite_sta
eb70: 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  t4 table. */.   
eb80: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53   nCol = pIdx->nS
eb90: 61 6d 70 6c 65 43 6f 6c 3b 0a 20 20 20 20 69 66  ampleCol;.    if
eba0: 28 20 70 49 64 78 21 3d 70 50 72 65 76 49 64 78  ( pIdx!=pPrevIdx
ebb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 69 74 41 76   ){.      initAv
ebc0: 67 45 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20  gEq(pPrevIdx);. 
ebd0: 20 20 20 20 20 70 50 72 65 76 49 64 78 20 3d 20       pPrevIdx = 
ebe0: 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pIdx;.    }.    
ebf0: 70 53 61 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d  pSample = &pIdx-
ec00: 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e 6e  >aSample[pIdx->n
ec10: 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64 65 63  Sample];.    dec
ec20: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
ec30: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ec40: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29 2c  n_text(pStmt,1),
ec50: 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e  nCol,pSample->an
ec60: 45 71 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63  Eq,0,0);.    dec
ec70: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
ec80: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ec90: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c  n_text(pStmt,2),
eca0: 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e  nCol,pSample->an
ecb0: 4c 74 2c 30 2c 30 29 3b 0a 20 20 20 20 64 65 63  Lt,0,0);.    dec
ecc0: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
ecd0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ece0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33 29 2c  n_text(pStmt,3),
ecf0: 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e 61 6e  nCol,pSample->an
ed00: 44 4c 74 2c 30 2c 30 29 3b 0a 0a 20 20 20 20 2f  DLt,0,0);..    /
ed10: 2a 20 54 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Take a copy of
ed20: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 41 64 64   the sample. Add
ed30: 20 74 77 6f 20 30 78 30 30 20 62 79 74 65 73 20   two 0x00 bytes 
ed40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
ed50: 75 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20 54 68  uffer..    ** Th
ed60: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
ed70: 65 20 73 61 6d 70 6c 65 20 72 65 63 6f 72 64 20  e sample record 
ed80: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 49 6e  is corrupted. In
ed90: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
eda0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
edb0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
edc0: 29 20 6d 61 79 20 72 65 61 64 20 75 70 20 74 6f  ) may read up to
edd0: 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
ede0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
edf0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
ee00: 64 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  d buffer before 
ee10: 69 74 20 72 65 61 6c 69 7a 65 73 20 69 74 20 69  it realizes it i
ee20: 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20  s dealing with. 
ee30: 20 20 20 2a 2a 20 61 20 63 6f 72 72 75 70 74 20     ** a corrupt 
ee40: 72 65 63 6f 72 64 2e 20 41 64 64 69 6e 67 20 74  record. Adding t
ee50: 68 65 20 74 77 6f 20 30 78 30 30 20 62 79 74 65  he two 0x00 byte
ee60: 73 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  s prevents this 
ee70: 66 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20 20 20  from causing.   
ee80: 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
ee90: 72 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20 20 70  rread.  */.    p
eea0: 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71 6c 69  Sample->n = sqli
eeb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
eec0: 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20  (pStmt, 4);.    
eed0: 70 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73 71 6c  pSample->p = sql
eee0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
eef0: 28 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 20  (db, pSample->n 
ef00: 2b 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70 53  + 2);.    if( pS
ef10: 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b 0a 20  ample->p==0 ){. 
ef20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
ef30: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
ef40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ef50: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
ef60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 61 6d    }.    if( pSam
ef70: 70 6c 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  ple->n ){.      
ef80: 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c 65 2d 3e  memcpy(pSample->
ef90: 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  p, sqlite3_colum
efa0: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29  n_blob(pStmt, 4)
efb0: 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20  , pSample->n);. 
efc0: 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e     }.    pIdx->n
efd0: 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20  Sample++;.  }.  
efe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
eff0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
f000: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f010: 4b 20 29 20 69 6e 69 74 41 76 67 45 71 28 70 50  K ) initAvgEq(pP
f020: 72 65 76 49 64 78 29 3b 0a 20 20 72 65 74 75 72  revIdx);.  retur
f030: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
f040: 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
f050: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
f060: 34 20 74 61 62 6c 65 20 69 6e 74 6f 20 0a 2a 2a  4 table into .**
f070: 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70   the Index.aSamp
f080: 6c 65 5b 5d 20 61 72 72 61 79 73 20 6f 66 20 61  le[] arrays of a
f090: 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73  ll indices..*/.s
f0a0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74  tatic int loadSt
f0b0: 61 74 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  at4(sqlite3 *db,
f0c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
f0d0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f0e0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
f0f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
f100: 6f 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75  odes from subrou
f110: 74 69 6e 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  tines */..  asse
f120: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
f130: 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
f140: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
f150: 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
f160: 5f 73 74 61 74 34 22 2c 20 7a 44 62 29 20 29 7b  _stat4", zDb) ){
f170: 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74  .    rc = loadSt
f180: 61 74 54 62 6c 28 64 62 2c 0a 20 20 20 20 20 20  atTbl(db,.      
f190: 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e  "SELECT idx,coun
f1a0: 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c  t(*) FROM %Q.sql
f1b0: 69 74 65 5f 73 74 61 74 34 20 47 52 4f 55 50 20  ite_stat4 GROUP 
f1c0: 42 59 20 69 64 78 22 2c 20 0a 20 20 20 20 20 20  BY idx", .      
f1d0: 22 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c  "SELECT idx,neq,
f1e0: 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20  nlt,ndlt,sample 
f1f0: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
f200: 74 61 74 34 22 2c 0a 20 20 20 20 20 20 7a 44 62  tat4",.      zDb
f210: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
f220: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
f230: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
f240: 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT4 */../*.
f250: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ** Load the cont
f260: 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ent of the sqlit
f270: 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69  e_stat1 and sqli
f280: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 2e  te_stat4 tables.
f290: 20 54 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   The.** contents
f2a0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31   of sqlite_stat1
f2b0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70   are used to pop
f2c0: 75 6c 61 74 65 20 74 68 65 20 49 6e 64 65 78 2e  ulate the Index.
f2d0: 61 69 52 6f 77 45 73 74 5b 5d 0a 2a 2a 20 61 72  aiRowEst[].** ar
f2e0: 72 61 79 73 2e 20 54 68 65 20 63 6f 6e 74 65 6e  rays. The conten
f2f0: 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ts of sqlite_sta
f300: 74 34 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  t4 are used to p
f310: 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 49  opulate the.** I
f320: 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61  ndex.aSample[] a
f330: 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrays..**.** If 
f340: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
f350: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72   table is not pr
f360: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
f370: 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52  abase, SQLITE_ER
f380: 52 4f 52 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ROR.** is return
f390: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
f3a0: 2c 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45  , even if SQLITE
f3b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 77 61  _ENABLE_STAT4 wa
f3c0: 73 20 64 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75  s defined .** du
f3d0: 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  ring compilation
f3e0: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
f3f0: 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20 70  stat4 table is p
f400: 72 65 73 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20  resent, no data 
f410: 69 73 20 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  is .** read from
f420: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   it..**.** If SQ
f430: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
f440: 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 64 75  4 was defined du
f450: 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  ring compilation
f460: 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c   and the .** sql
f470: 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20  ite_stat4 table 
f480: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
f490: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
f4a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 0a  SQLITE_ERROR is.
f4b0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 48 6f 77  ** returned. How
f4c0: 65 76 65 72 2c 20 69 6e 20 74 68 69 73 20 63 61  ever, in this ca
f4d0: 73 65 2c 20 64 61 74 61 20 69 73 20 72 65 61 64  se, data is read
f4e0: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
f4f0: 5f 73 74 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20  _stat1.** table 
f500: 28 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e  (if it is presen
f510: 74 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  t) before return
f520: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
f530: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
f540: 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
f550: 20 61 6c 77 61 79 73 20 73 65 74 73 20 64 62 2d   always sets db-
f560: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
f570: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  * This means if 
f580: 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  the caller does 
f590: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 6f  not care about o
f5a0: 74 68 65 72 20 65 72 72 6f 72 73 2c 20 74 68 65  ther errors, the
f5b0: 20 72 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20   return.** code 
f5c0: 6d 61 79 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  may be ignored..
f5d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6e  */.int sqlite3An
f5e0: 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69 74  alysisLoad(sqlit
f5f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
f600: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
f610: 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c   sInfo;.  HashEl
f620: 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a  em *i;.  char *z
f630: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sql;.  int rc = 
f640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 63 68  SQLITE_OK;.  Sch
f650: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
f660: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
f670: 65 6d 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ema;..  assert( 
f680: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
f690: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
f6a0: 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
f6b0: 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  pBt!=0 );..  /* 
f6c0: 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20  Clear any prior 
f6d0: 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  statistics */.  
f6e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
f6f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
f700: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
f710: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
f720: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
f730: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
f740: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
f750: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
f760: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
f770: 61 74 61 28 69 29 3b 0a 20 20 20 20 70 54 61 62  ata(i);.    pTab
f780: 2d 3e 74 61 62 46 6c 61 67 73 20 26 3d 20 7e 54  ->tabFlags &= ~T
f790: 46 5f 48 61 73 53 74 61 74 31 3b 0a 20 20 7d 0a  F_HasStat1;.  }.
f7a0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
f7b0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
f7c0: 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69  ->idxHash); i; i
f7d0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
f7e0: 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
f7f0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
f800: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 70 49  hData(i);.    pI
f810: 64 78 2d 3e 68 61 73 53 74 61 74 31 20 3d 20 30  dx->hasStat1 = 0
f820: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f830: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20  ENABLE_STAT4.   
f840: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
f850: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
f860: 49 64 78 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  Idx);.    pIdx->
f870: 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6e  aSample = 0;.#en
f880: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  dif.  }..  /* Lo
f890: 61 64 20 6e 65 77 20 73 74 61 74 69 73 74 69 63  ad new statistic
f8a0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 71 6c  s out of the sql
f8b0: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
f8c0: 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20  */.  sInfo.db = 
f8d0: 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74  db;.  sInfo.zDat
f8e0: 61 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b  abase = db->aDb[
f8f0: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
f900: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
f910: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
f920: 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
f930: 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b  zDatabase)!=0 ){
f940: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
f950: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
f960: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
f970: 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52 4f  tbl,idx,stat FRO
f980: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
f990: 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  1", sInfo.zDatab
f9a0: 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ase);.    if( zS
f9b0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
f9c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f9d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
f9e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
f9f0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
fa00: 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  ql, analysisLoad
fa10: 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a  er, &sInfo, 0);.
fa20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fa30: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
fa40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
fa50: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  et appropriate d
fa60: 65 66 61 75 6c 74 73 20 6f 6e 20 61 6c 6c 20 69  efaults on all i
fa70: 6e 64 65 78 65 73 20 6e 6f 74 20 69 6e 20 74 68  ndexes not in th
fa80: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
fa90: 61 62 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  able */.  assert
faa0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
fab0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
fac0: 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  , 0) );.  for(i=
fad0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
fae0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
faf0: 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
fb00: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
fb10: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
fb20: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
fb30: 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 2d  ;.    if( !pIdx-
fb40: 3e 68 61 73 53 74 61 74 31 20 29 20 73 71 6c 69  >hasStat1 ) sqli
fb50: 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
fb60: 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
fb70: 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74 69  * Load the stati
fb80: 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73  stics from the s
fb90: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
fba0: 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e. */.#ifdef SQL
fbb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
fbc0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
fbd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
fbe0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
fbf0: 6c 65 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 6c  le++;.    rc = l
fc00: 6f 61 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e  oadStat4(db, sIn
fc10: 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  fo.zDatabase);. 
fc20: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
fc30: 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d  .bDisable--;.  }
fc40: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
fc50: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
fc60: 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 69 3b 20  a->idxHash); i; 
fc70: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
fc80: 28 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  (i)){.    Index 
fc90: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
fca0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73  shData(i);.    s
fcb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
fcc0: 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 20 20 20  ->aiRowEst);.   
fcd0: 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20   pIdx->aiRowEst 
fce0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
fcf0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
fd00: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
fd10: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
fd20: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
fd30: 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20   rc;.}...#endif 
fd40: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
fd50: 4e 41 4c 59 5a 45 20 2a 2f 0a                    NALYZE */.