/ Hex Artifact Content
Login

Artifact a4c1c3048f6d9e090eb76e83eecb18bcf6d31a70:


0000: 23 20 32 30 31 33 20 41 75 67 75 73 74 20 33 0a  # 2013 August 3.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 0a 23 20 54 68 69 73 20 66  *****.#.# This f
0170: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 75 74  ile contains aut
0180: 6f 6d 61 74 65 64 20 74 65 73 74 73 20 75 73 65  omated tests use
0190: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
01a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
01b0: 33 0a 23 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  3.# functionalit
01c0: 79 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54 68  y is working. Th
01d0: 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20  e tests in this 
01e0: 66 69 6c 65 20 61 72 65 20 62 61 73 65 64 20 6f  file are based o
01f0: 6e 20 61 20 73 75 62 73 65 74 0a 23 20 6f 66 20  n a subset.# of 
0200: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
0210: 20 74 65 73 74 73 20 69 6e 20 61 6e 61 6c 79 7a   tests in analyz
0220: 65 39 2e 74 65 73 74 2e 0a 23 0a 0a 73 65 74 20  e9.test..#..set 
0230: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0240: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0250: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0260: 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73  ster.tcl.set tes
0270: 74 70 72 65 66 69 78 20 61 6e 61 6c 79 7a 65 42  tprefix analyzeB
0280: 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 73 74 61  ..ifcapable !sta
0290: 74 33 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  t3 {.  finish_te
02a0: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64  st.  return.}..d
02b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
02c0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
02d0: 42 4c 45 20 74 31 28 61 20 54 45 58 54 2c 20 62  BLE t1(a TEXT, b
02e0: 20 54 45 58 54 29 3b 20 0a 20 20 49 4e 53 45 52   TEXT); .  INSER
02f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0300: 28 27 28 30 29 27 2c 20 27 28 30 29 27 29 3b 0a  ('(0)', '(0)');.
0310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0320: 20 56 41 4c 55 45 53 28 27 28 31 29 27 2c 20 27   VALUES('(1)', '
0330: 28 31 29 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  (1)');.  INSERT 
0340: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
0350: 28 32 29 27 2c 20 27 28 32 29 27 29 3b 0a 20 20  (2)', '(2)');.  
0360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0370: 41 4c 55 45 53 28 27 28 33 29 27 2c 20 27 28 33  ALUES('(3)', '(3
0380: 29 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  )');.  INSERT IN
0390: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 28 34  TO t1 VALUES('(4
03a0: 29 27 2c 20 27 28 34 29 27 29 3b 0a 20 20 43 52  )', '(4)');.  CR
03b0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
03c0: 20 74 31 28 61 2c 20 62 29 3b 0a 7d 20 7b 7d 0a   t1(a, b);.} {}.
03d0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
03e0: 74 20 31 2e 31 20 7b 0a 20 20 41 4e 41 4c 59 5a  t 1.1 {.  ANALYZ
03f0: 45 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63  E;.} {}..do_exec
0400: 73 71 6c 5f 74 65 73 74 20 31 2e 32 20 7b 0a 20  sql_test 1.2 {. 
0410: 20 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c   SELECT tbl,idx,
0420: 6e 45 71 2c 6e 4c 74 2c 6e 44 4c 74 2c 71 75 6f  nEq,nLt,nDLt,quo
0430: 74 65 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20  te(sample) FROM 
0440: 73 71 6c 69 74 65 5f 73 74 61 74 33 3b 0a 7d 20  sqlite_stat3;.} 
0450: 7b 0a 20 20 74 31 20 69 31 20 31 20 30 20 30 20  {.  t1 i1 1 0 0 
0460: 27 28 30 29 27 0a 20 20 74 31 20 69 31 20 31 20  '(0)'.  t1 i1 1 
0470: 31 20 31 20 27 28 31 29 27 0a 20 20 74 31 20 69  1 1 '(1)'.  t1 i
0480: 31 20 31 20 32 20 32 20 27 28 32 29 27 0a 20 20  1 1 2 2 '(2)'.  
0490: 74 31 20 69 31 20 31 20 33 20 33 20 27 28 33 29  t1 i1 1 3 3 '(3)
04a0: 27 0a 20 20 74 31 20 69 31 20 31 20 34 20 34 20  '.  t1 i1 1 4 4 
04b0: 27 28 34 29 27 0a 7d 0a 0a 69 66 20 7b 5b 70 65  '(4)'.}..if {[pe
04c0: 72 6d 75 74 61 74 69 6f 6e 5d 20 21 3d 20 22 75  rmutation] != "u
04d0: 74 66 31 36 22 7d 20 7b 0a 20 20 64 6f 5f 65 78  tf16"} {.  do_ex
04e0: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20 7b  ecsql_test 1.3 {
04f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 62 6c 2c  .    SELECT tbl,
0500: 69 64 78 2c 6e 45 71 2c 6e 4c 74 2c 6e 44 4c 74  idx,nEq,nLt,nDLt
0510: 2c 71 75 6f 74 65 28 73 61 6d 70 6c 65 29 20 46  ,quote(sample) F
0520: 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ROM sqlite_stat3
0530: 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 74 31 20 69  ;.  } {.    t1 i
0540: 31 20 31 20 30 20 30 20 27 28 30 29 27 0a 20 20  1 1 0 0 '(0)'.  
0550: 20 20 74 31 20 69 31 20 31 20 31 20 31 20 27 28    t1 i1 1 1 1 '(
0560: 31 29 27 0a 20 20 20 20 74 31 20 69 31 20 31 20  1)'.    t1 i1 1 
0570: 32 20 32 20 27 28 32 29 27 0a 20 20 20 20 74 31  2 2 '(2)'.    t1
0580: 20 69 31 20 31 20 33 20 33 20 27 28 33 29 27 0a   i1 1 3 3 '(3)'.
0590: 20 20 20 20 74 31 20 69 31 20 31 20 34 20 34 20      t1 i1 1 4 4 
05a0: 27 28 34 29 27 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d  '(4)'.  }.}...#-
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
0600: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
0610: 6f 20 74 65 73 74 20 53 51 4c 20 75 73 65 72 20  o test SQL user 
0620: 66 75 6e 63 74 69 6f 6e 20 22 74 65 73 74 5f 64  function "test_d
0630: 65 63 6f 64 65 22 2e 0a 23 0a 72 65 73 65 74 5f  ecode"..#.reset_
0640: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
0650: 73 74 20 32 2e 31 20 7b 0a 20 20 43 52 45 41 54  st 2.1 {.  CREAT
0660: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
0670: 20 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   c);.  INSERT IN
0680: 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53 28  TO t1(a) VALUES(
0690: 27 73 6f 6d 65 20 74 65 78 74 27 29 3b 0a 20 20  'some text');.  
06a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
06b0: 29 20 56 41 4c 55 45 53 28 31 34 29 3b 0a 20 20  ) VALUES(14);.  
06c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
06d0: 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a  ) VALUES(NULL);.
06e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
06f0: 28 61 29 20 56 41 4c 55 45 53 28 32 32 2e 30 29  (a) VALUES(22.0)
0700: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0710: 74 31 28 61 29 20 56 41 4c 55 45 53 28 78 27 36  t1(a) VALUES(x'6
0720: 35 36 36 36 37 27 29 3b 0a 20 20 43 52 45 41 54  56667');.  CREAT
0730: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
0740: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 41 4e 41  (a, b, c);.  ANA
0750: 4c 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20 71  LYZE;.  SELECT q
0760: 75 6f 74 65 28 73 61 6d 70 6c 65 29 20 46 52 4f  uote(sample) FRO
0770: 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 3b 0a  M sqlite_stat3;.
0780: 7d 20 7b 0a 20 20 4e 55 4c 4c 20 31 34 20 32 32  } {.  NULL 14 22
0790: 2e 30 20 7b 27 73 6f 6d 65 20 74 65 78 74 27 7d  .0 {'some text'}
07a0: 20 58 27 36 35 36 36 36 37 27 20 0a 7d 0a 0a 23   X'656667' .}..#
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 0a 72 65 73  ---------.# .res
0800: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
0810: 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43 52  _test 3.1 {.  CR
0820: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
0830: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   b);.  CREATE IN
0840: 44 45 58 20 69 32 20 4f 4e 20 74 32 28 61 2c 20  DEX i2 ON t2(a, 
0850: 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 0a 0a  b);.  BEGIN;.}..
0860: 64 6f 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20  do_test 3.2 {.  
0870: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
0880: 69 20 3c 20 31 30 30 30 7d 20 7b 69 6e 63 72 20  i < 1000} {incr 
0890: 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b  i} {.    set a [
08a0: 65 78 70 72 20 24 69 20 2f 20 31 30 5d 0a 20 20  expr $i / 10].  
08b0: 20 20 73 65 74 20 62 20 5b 65 78 70 72 20 69 6e    set b [expr in
08c0: 74 28 72 61 6e 64 28 29 20 2a 20 31 35 2e 30 29  t(rand() * 15.0)
08d0: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ].    execsql { 
08e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
08f0: 41 4c 55 45 53 28 24 61 2c 20 24 62 29 20 7d 0a  ALUES($a, $b) }.
0900: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f    }.  execsql CO
0910: 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 62 20 66 75  MMIT.} {}..db fu
0920: 6e 63 20 6c 69 6e 64 65 78 20 6c 69 6e 64 65 78  nc lindex lindex
0930: 0a 0a 23 20 45 61 63 68 20 76 61 6c 75 65 20 6f  ..# Each value o
0940: 66 20 22 61 22 20 6f 63 63 75 72 73 20 65 78 61  f "a" occurs exa
0950: 63 74 6c 79 20 31 30 20 74 69 6d 65 73 20 69 6e  ctly 10 times in
0960: 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f   the table..#.do
0970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0980: 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 63  3.1 {.  SELECT c
0990: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
09a0: 47 52 4f 55 50 20 42 59 20 61 3b 0a 7d 20 5b 6c  GROUP BY a;.} [l
09b0: 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65  range [string re
09c0: 70 65 61 74 20 22 31 30 20 22 20 31 30 30 5d 20  peat "10 " 100] 
09d0: 30 20 39 39 5d 0a 0a 23 20 54 68 65 20 66 69 72  0 99]..# The fir
09e0: 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68  st element in th
09f0: 65 20 22 6e 45 71 22 20 6c 69 73 74 20 6f 66 20  e "nEq" list of 
0a00: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 73 68 6f 75  all samples shou
0a10: 6c 64 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ld therefore be 
0a20: 31 30 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  10..#.do_execsql
0a30: 5f 74 65 73 74 20 33 2e 33 2e 32 20 7b 0a 20 20  _test 3.3.2 {.  
0a40: 41 4e 41 4c 59 5a 45 3b 0a 20 20 53 45 4c 45 43  ANALYZE;.  SELEC
0a50: 54 20 6e 45 71 20 46 52 4f 4d 20 73 71 6c 69 74  T nEq FROM sqlit
0a60: 65 5f 73 74 61 74 33 3b 0a 7d 20 5b 6c 72 61 6e  e_stat3;.} [lran
0a70: 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ge [string repea
0a80: 74 20 22 31 30 20 22 20 31 30 30 5d 20 30 20 32  t "10 " 100] 0 2
0a90: 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3]..#-----------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0ae0: 20 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73   .do_execsql_tes
0af0: 74 20 33 2e 34 20 7b 0a 20 20 44 52 4f 50 20 54  t 3.4 {.  DROP T
0b00: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
0b10: 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  1;.  CREATE TABL
0b20: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
0b30: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
0b40: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0b50: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c   t1 VALUES(1, 1,
0b60: 20 27 6f 6e 65 2d 61 27 29 3b 0a 20 20 49 4e 53   'one-a');.  INS
0b70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0b80: 45 53 28 31 31 2c 20 31 2c 20 27 6f 6e 65 2d 62  ES(11, 1, 'one-b
0b90: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
0ba0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 31 2c 20  O t1 VALUES(21, 
0bb0: 31 2c 20 27 6f 6e 65 2d 63 27 29 3b 0a 20 20 49  1, 'one-c');.  I
0bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0bd0: 4c 55 45 53 28 33 31 2c 20 31 2c 20 27 6f 6e 65  LUES(31, 1, 'one
0be0: 2d 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  -d');.  INSERT I
0bf0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 31  NTO t1 VALUES(41
0c00: 2c 20 31 2c 20 27 6f 6e 65 2d 65 27 29 3b 0a 20  , 1, 'one-e');. 
0c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0c20: 56 41 4c 55 45 53 28 35 31 2c 20 31 2c 20 27 6f  VALUES(51, 1, 'o
0c30: 6e 65 2d 66 27 29 3b 0a 20 20 49 4e 53 45 52 54  ne-f');.  INSERT
0c40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0c50: 36 31 2c 20 31 2c 20 27 6f 6e 65 2d 67 27 29 3b  61, 1, 'one-g');
0c60: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0c70: 31 20 56 41 4c 55 45 53 28 37 31 2c 20 31 2c 20  1 VALUES(71, 1, 
0c80: 27 6f 6e 65 2d 68 27 29 3b 0a 20 20 49 4e 53 45  'one-h');.  INSE
0c90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0ca0: 53 28 38 31 2c 20 31 2c 20 27 6f 6e 65 2d 69 27  S(81, 1, 'one-i'
0cb0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0cc0: 20 74 31 20 56 41 4c 55 45 53 28 39 31 2c 20 31   t1 VALUES(91, 1
0cd0: 2c 20 27 6f 6e 65 2d 6a 27 29 3b 0a 20 20 49 4e  , 'one-j');.  IN
0ce0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0cf0: 45 43 54 20 61 2b 31 2c 32 2c 27 74 77 6f 27 20  ECT a+1,2,'two' 
0d00: 7c 7c 20 73 75 62 73 74 72 28 63 2c 34 29 20 46  || substr(c,4) F
0d10: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
0d20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0d30: 61 2b 32 2c 33 2c 27 74 68 72 65 65 27 7c 7c 73  a+2,3,'three'||s
0d40: 75 62 73 74 72 28 63 2c 34 29 20 46 52 4f 4d 20  ubstr(c,4) FROM 
0d50: 74 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20  t1 WHERE c GLOB 
0d60: 27 6f 6e 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52  'one-*';.  INSER
0d70: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0d80: 20 61 2b 33 2c 34 2c 27 66 6f 75 72 27 7c 7c 73   a+3,4,'four'||s
0d90: 75 62 73 74 72 28 63 2c 34 29 20 46 52 4f 4d 20  ubstr(c,4) FROM 
0da0: 74 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20  t1 WHERE c GLOB 
0db0: 27 6f 6e 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52  'one-*';.  INSER
0dc0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0dd0: 20 61 2b 34 2c 35 2c 27 66 69 76 65 27 7c 7c 73   a+4,5,'five'||s
0de0: 75 62 73 74 72 28 63 2c 34 29 20 46 52 4f 4d 20  ubstr(c,4) FROM 
0df0: 74 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20  t1 WHERE c GLOB 
0e00: 27 6f 6e 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52  'one-*';.  INSER
0e10: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0e20: 20 61 2b 35 2c 36 2c 27 73 69 78 27 7c 7c 73 75   a+5,6,'six'||su
0e30: 62 73 74 72 28 63 2c 34 29 20 46 52 4f 4d 20 74  bstr(c,4) FROM t
0e40: 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27  1 WHERE c GLOB '
0e50: 6f 6e 65 2d 2a 27 3b 09 0a 20 20 43 52 45 41 54  one-*';..  CREAT
0e60: 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74  E INDEX t1b ON t
0e70: 31 28 62 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b  1(b);.  ANALYZE;
0e80: 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  .  SELECT c FROM
0e90: 20 74 31 20 57 48 45 52 45 20 62 3d 33 20 41 4e   t1 WHERE b=3 AN
0ea0: 44 20 61 20 42 45 54 57 45 45 4e 20 33 30 20 41  D a BETWEEN 30 A
0eb0: 4e 44 20 36 30 3b 0a 7d 20 7b 74 68 72 65 65 2d  ND 60;.} {three-
0ec0: 64 20 74 68 72 65 65 2d 65 20 74 68 72 65 65 2d  d three-e three-
0ed0: 66 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  f}...#----------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0f20: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 76 65  # These tests ve
0f30: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
0f40: 6d 70 6c 65 20 73 65 6c 65 63 74 69 6f 6e 20 66  mple selection f
0f50: 6f 72 20 73 74 61 74 33 20 61 70 70 65 61 72 73  or stat3 appears
0f60: 20 74 6f 20 62 65 20 0a 23 20 77 6f 72 6b 69 6e   to be .# workin
0f70: 67 20 61 73 20 64 65 73 69 67 6e 65 64 2e 0a 23  g as designed..#
0f80: 0a 0a 72 65 73 65 74 5f 64 62 0a 64 62 20 66 75  ..reset_db.db fu
0f90: 6e 63 20 6c 69 6e 64 65 78 20 6c 69 6e 64 65 78  nc lindex lindex
0fa0: 0a 64 62 20 66 75 6e 63 20 6c 72 61 6e 67 65 20  .db func lrange 
0fb0: 6c 72 61 6e 67 65 0a 0a 64 6f 5f 65 78 65 63 73  lrange..do_execs
0fc0: 71 6c 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20  ql_test 4.0 {.  
0fd0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
0fe0: 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54  ISTS t1;.  CREAT
0ff0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
1000: 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   c);.  CREATE IN
1010: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c 20  DEX i1 ON t1(c, 
1020: 62 2c 20 61 29 3b 0a 7d 0a 0a 0a 70 72 6f 63 20  b, a);.}...proc 
1030: 69 6e 73 65 72 74 5f 66 69 6c 6c 65 72 5f 72 6f  insert_filler_ro
1040: 77 73 5f 6e 20 7b 69 53 74 61 72 74 20 61 72 67  ws_n {iStart arg
1050: 73 7d 20 7b 0a 20 20 73 65 74 20 41 28 2d 6e 63  s} {.  set A(-nc
1060: 6f 70 79 29 20 31 0a 20 20 73 65 74 20 41 28 2d  opy) 1.  set A(-
1070: 6e 76 61 6c 29 20 31 0a 0a 20 20 66 6f 72 65 61  nval) 1..  forea
1080: 63 68 20 7b 6b 20 76 7d 20 24 61 72 67 73 20 7b  ch {k v} $args {
1090: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
10a0: 78 69 73 74 73 20 41 28 24 6b 29 5d 3d 3d 30 7d  xists A($k)]==0}
10b0: 20 7b 20 65 72 72 6f 72 20 22 6e 6f 20 73 75 63   { error "no suc
10c0: 68 20 6f 70 74 69 6f 6e 3a 20 24 6b 22 20 7d 0a  h option: $k" }.
10d0: 20 20 20 20 73 65 74 20 41 28 24 6b 29 20 24 76      set A($k) $v
10e0: 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e  .  }.  if {[llen
10f0: 67 74 68 20 24 61 72 67 73 5d 20 25 20 32 7d 20  gth $args] % 2} 
1100: 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 6f 70 74  {.    error "opt
1110: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
1120: 61 72 67 75 6d 65 6e 74 3a 20 5b 6c 69 6e 64 65  argument: [linde
1130: 78 20 24 61 72 67 73 20 65 6e 64 5d 22 0a 20 20  x $args end]".  
1140: 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  }..  for {set i 
1150: 30 7d 20 7b 24 69 20 3c 20 24 41 28 2d 6e 76 61  0} {$i < $A(-nva
1160: 6c 29 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  l)} {incr i} {. 
1170: 20 20 20 73 65 74 20 69 56 61 6c 20 5b 65 78 70     set iVal [exp
1180: 72 20 24 69 53 74 61 72 74 2b 24 69 5d 0a 20 20  r $iStart+$i].  
1190: 20 20 66 6f 72 20 7b 73 65 74 20 6a 20 30 7d 20    for {set j 0} 
11a0: 7b 24 6a 20 3c 20 24 41 28 2d 6e 63 6f 70 79 29  {$j < $A(-ncopy)
11b0: 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20  } {incr j} {.   
11c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
11d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11e0: 45 53 28 24 69 56 61 6c 2c 20 24 69 56 61 6c 2c  ES($iVal, $iVal,
11f0: 20 24 69 56 61 6c 29 20 7d 0a 20 20 20 20 7d 0a   $iVal) }.    }.
1200: 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 34    }.}..do_test 4
1210: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1220: 20 42 45 47 49 4e 20 7d 0a 20 20 69 6e 73 65 72   BEGIN }.  inser
1230: 74 5f 66 69 6c 6c 65 72 5f 72 6f 77 73 5f 6e 20  t_filler_rows_n 
1240: 20 30 20 20 2d 6e 63 6f 70 79 20 31 30 20 2d 6e   0  -ncopy 10 -n
1250: 76 61 6c 20 31 39 0a 20 20 69 6e 73 65 72 74 5f  val 19.  insert_
1260: 66 69 6c 6c 65 72 5f 72 6f 77 73 5f 6e 20 32 30  filler_rows_n 20
1270: 20 20 2d 6e 63 6f 70 79 20 20 31 20 2d 6e 76 61    -ncopy  1 -nva
1280: 6c 20 31 30 30 0a 0a 20 20 65 78 65 63 73 71 6c  l 100..  execsql
1290: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
12a0: 54 4f 20 74 31 28 63 2c 20 62 2c 20 61 29 20 56  TO t1(c, b, a) V
12b0: 41 4c 55 45 53 28 32 30 30 2c 20 31 2c 20 27 61  ALUES(200, 1, 'a
12c0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
12d0: 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20 61 29 20  NTO t1(c, b, a) 
12e0: 56 41 4c 55 45 53 28 32 30 30 2c 20 31 2c 20 27  VALUES(200, 1, '
12f0: 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
1300: 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20 61 29  INTO t1(c, b, a)
1310: 20 56 41 4c 55 45 53 28 32 30 30 2c 20 31 2c 20   VALUES(200, 1, 
1320: 27 63 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  'c');..    INSER
1330: 54 20 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20  T INTO t1(c, b, 
1340: 61 29 20 56 41 4c 55 45 53 28 32 30 30 2c 20 32  a) VALUES(200, 2
1350: 2c 20 27 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'e');.    INSE
1360: 52 54 20 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c  RT INTO t1(c, b,
1370: 20 61 29 20 56 41 4c 55 45 53 28 32 30 30 2c 20   a) VALUES(200, 
1380: 32 2c 20 27 66 27 29 3b 0a 0a 20 20 20 20 49 4e  2, 'f');..    IN
1390: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63 2c 20  SERT INTO t1(c, 
13a0: 62 2c 20 61 29 20 56 41 4c 55 45 53 28 32 30 31  b, a) VALUES(201
13b0: 2c 20 33 2c 20 27 67 27 29 3b 0a 20 20 20 20 49  , 3, 'g');.    I
13c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63 2c  NSERT INTO t1(c,
13d0: 20 62 2c 20 61 29 20 56 41 4c 55 45 53 28 32 30   b, a) VALUES(20
13e0: 31 2c 20 34 2c 20 27 68 27 29 3b 0a 0a 20 20 20  1, 4, 'h');..   
13f0: 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 53 45   ANALYZE;.    SE
1400: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1410: 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 3b  OM sqlite_stat3;
1420: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
1430: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
1440: 7d 0a 7d 20 7b 32 34 20 32 39 37 7d 0a 0a 64 6f  }.} {24 297}..do
1450: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
1460: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 65 71  2 {.  SELECT neq
1470: 2c 20 6e 6c 74 2c 20 6e 64 6c 74 2c 20 73 61 6d  , nlt, ndlt, sam
1480: 70 6c 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ple FROM sqlite_
1490: 73 74 61 74 33 20 4f 52 44 45 52 20 42 59 20 72  stat3 ORDER BY r
14a0: 6f 77 69 64 20 4c 49 4d 49 54 20 31 36 3b 0a 7d  owid LIMIT 16;.}
14b0: 20 7b 0a 20 20 31 30 20 30 20 30 20 30 0a 20 20   {.  10 0 0 0.  
14c0: 31 30 20 31 30 20 31 20 31 0a 20 20 31 30 20 32  10 10 1 1.  10 2
14d0: 30 20 32 20 32 0a 20 20 31 30 20 33 30 20 33 20  0 2 2.  10 30 3 
14e0: 33 0a 20 20 31 30 20 34 30 20 34 20 34 0a 20 20  3.  10 40 4 4.  
14f0: 31 30 20 35 30 20 35 20 35 0a 20 20 31 30 20 36  10 50 5 5.  10 6
1500: 30 20 36 20 36 0a 20 20 31 30 20 37 30 20 37 20  0 6 6.  10 70 7 
1510: 37 0a 20 20 31 30 20 38 30 20 38 20 38 0a 20 20  7.  10 80 8 8.  
1520: 31 30 20 39 30 20 39 20 39 0a 20 20 31 30 20 31  10 90 9 9.  10 1
1530: 30 30 20 31 30 20 31 30 0a 20 20 31 30 20 31 31  00 10 10.  10 11
1540: 30 20 31 31 20 31 31 0a 20 20 31 30 20 31 32 30  0 11 11.  10 120
1550: 20 31 32 20 31 32 0a 20 20 31 30 20 31 33 30 20   12 12.  10 130 
1560: 31 33 20 31 33 0a 20 20 31 30 20 31 34 30 20 31  13 13.  10 140 1
1570: 34 20 31 34 0a 20 20 31 30 20 31 35 30 20 31 35  4 14.  10 150 15
1580: 20 31 35 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   15.}..do_execsq
1590: 6c 5f 74 65 73 74 20 34 2e 33 20 7b 0a 20 20 53  l_test 4.3 {.  S
15a0: 45 4c 45 43 54 20 6e 65 71 2c 20 6e 6c 74 2c 20  ELECT neq, nlt, 
15b0: 6e 64 6c 74 2c 20 73 61 6d 70 6c 65 20 46 52 4f  ndlt, sample FRO
15c0: 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 20  M sqlite_stat3. 
15d0: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
15e0: 44 45 53 43 20 4c 49 4d 49 54 20 32 3b 0a 7d 20  DESC LIMIT 2;.} 
15f0: 7b 0a 20 20 32 20 32 39 35 20 31 32 30 20 32 30  {.  2 295 120 20
1600: 31 0a 20 20 35 20 32 39 30 20 31 31 39 20 32 30  1.  5 290 119 20
1610: 30 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  0.}..do_execsql_
1620: 74 65 73 74 20 34 2e 34 20 7b 20 53 45 4c 45 43  test 4.4 { SELEC
1630: 54 20 63 6f 75 6e 74 28 44 49 53 54 49 4e 43 54  T count(DISTINCT
1640: 20 63 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52   c) FROM t1 WHER
1650: 45 20 63 3c 32 30 31 20 7d 20 31 32 30 0a 64 6f  E c<201 } 120.do
1660: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
1670: 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  5 { SELECT count
1680: 28 44 49 53 54 49 4e 43 54 20 63 29 20 46 52 4f  (DISTINCT c) FRO
1690: 4d 20 74 31 20 57 48 45 52 45 20 63 3c 32 30 30  M t1 WHERE c<200
16a0: 20 7d 20 31 31 39 0a 0a 72 65 73 65 74 5f 64 62   } 119..reset_db
16b0: 0a 64 6f 5f 74 65 73 74 20 34 2e 37 20 7b 0a 20  .do_test 4.7 {. 
16c0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
16d0: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
16e0: 45 20 54 41 42 4c 45 20 74 31 28 6f 2c 74 20 49  E TABLE t1(o,t I
16f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1700: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
1710: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 6f  INDEX i1 ON t1(o
1720: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
1730: 74 20 69 20 30 7d 20 7b 24 69 3c 31 30 30 30 30  t i 0} {$i<10000
1740: 7d 20 7b 69 6e 63 72 20 69 20 5b 65 78 70 72 20  } {incr i [expr 
1750: 28 28 24 69 3c 31 30 30 30 29 3f 31 3a 31 30 29  (($i<1000)?1:10)
1760: 5d 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  ]} {.    execsql
1770: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1780: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 24 69  1 VALUES('x', $i
1790: 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ) }.  }.  execsq
17a0: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
17b0: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20      ANALYZE;.   
17c0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
17d0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
17e0: 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  t3;.  }.} {1}.do
17f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
1800: 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 61 6d  8 {.  SELECT sam
1810: 70 6c 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ple FROM sqlite_
1820: 73 74 61 74 33 3b 0a 7d 20 7b 78 7d 0a 0a 0a 23  stat3;.} {x}...#
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
1880: 66 6f 6c 6c 6f 77 69 6e 67 20 77 6f 75 6c 64 20  following would 
1890: 63 61 75 73 65 20 61 20 63 72 61 73 68 20 61 74  cause a crash at
18a0: 20 6f 6e 65 20 70 6f 69 6e 74 2e 0a 23 0a 72 65   one point..#.re
18b0: 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71  set_db.do_execsq
18c0: 6c 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 50  l_test 5.1 {.  P
18d0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
18e0: 20 27 75 74 66 2d 31 36 27 3b 0a 20 20 43 52 45   'utf-16';.  CRE
18f0: 41 54 45 20 54 41 42 4c 45 20 74 30 28 76 29 3b  ATE TABLE t0(v);
1900: 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 7d 0a 0a 23  .  ANALYZE;.}..#
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
1960: 20 77 61 73 20 61 6c 73 6f 20 63 72 61 73 68 69   was also crashi
1970: 6e 67 20 28 63 6f 72 72 75 70 74 20 73 71 6c 69  ng (corrupt sqli
1980: 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 29 2e  te_stat3 table).
1990: 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  .#.reset_db.do_e
19a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 31 20  xecsql_test 6.1 
19b0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
19c0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   t1(a, b);.  CRE
19d0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
19e0: 74 31 28 61 29 3b 0a 20 20 43 52 45 41 54 45 20  t1(a);.  CREATE 
19f0: 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1a00: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1a10: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29   t1 VALUES(1, 1)
1a20: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1a30: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32 29 3b  t1 VALUES(2, 2);
1a40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1a50: 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a  1 VALUES(3, 3);.
1a60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1a70: 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
1a80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1a90: 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20  VALUES(5, 5);.  
1aa0: 41 4e 41 4c 59 5a 45 3b 0a 20 20 50 52 41 47 4d  ANALYZE;.  PRAGM
1ab0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1ac0: 61 20 3d 20 31 3b 0a 20 20 43 52 45 41 54 45 20  a = 1;.  CREATE 
1ad0: 54 45 4d 50 20 54 41 42 4c 45 20 78 31 20 41 53  TEMP TABLE x1 AS
1ae0: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 62 6c 2c  .    SELECT tbl,
1af0: 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74  idx,neq,nlt,ndlt
1b00: 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 73 71 6c  ,sample FROM sql
1b10: 69 74 65 5f 73 74 61 74 33 0a 20 20 20 20 4f 52  ite_stat3.    OR
1b20: 44 45 52 20 42 59 20 28 72 6f 77 69 64 25 35 29  DER BY (rowid%5)
1b30: 2c 20 72 6f 77 69 64 3b 0a 20 20 44 45 4c 45 54  , rowid;.  DELET
1b40: 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  E FROM sqlite_st
1b50: 61 74 33 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  at3;.  INSERT IN
1b60: 54 4f 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  TO sqlite_stat3 
1b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31  SELECT * FROM x1
1b80: 3b 0a 20 20 50 52 41 47 4d 41 20 77 72 69 74 61  ;.  PRAGMA writa
1b90: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a  ble_schema = 0;.
1ba0: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
1bb0: 5f 6d 61 73 74 65 72 3b 0a 7d 0a 64 6f 5f 65 78  _master;.}.do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 32 20 7b  ecsql_test 6.2 {
1bd0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1be0: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 27 61   t1 WHERE a = 'a
1bf0: 62 63 27 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  bc';.}..#-------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c40: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
1c50: 6e 67 20 74 65 73 74 73 20 65 78 70 65 72 69 6d  ng tests experim
1c60: 65 6e 74 20 77 69 74 68 20 61 64 64 69 6e 67 20  ent with adding 
1c70: 63 6f 72 72 75 70 74 65 64 20 72 65 63 6f 72 64  corrupted record
1c80: 73 20 74 6f 20 74 68 65 0a 23 20 27 73 61 6d 70  s to the.# 'samp
1c90: 6c 65 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  le' column of th
1ca0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  e sqlite_stat3 t
1cb0: 61 62 6c 65 2e 0a 23 0a 72 65 73 65 74 5f 64 62  able..#.reset_db
1cc0: 0a 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  .sqlite3_db_conf
1cd0: 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20  ig_lookaside db 
1ce0: 30 20 30 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71  0 0 0..do_execsq
1cf0: 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43  l_test 7.1 {.  C
1d00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
1d10: 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49  , b);.  CREATE I
1d20: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
1d30: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
1d40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1d50: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
1d60: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32  O t1 VALUES(2, 2
1d70: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1d80: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29   t1 VALUES(3, 3)
1d90: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1da0: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b  t1 VALUES(4, 4);
1db0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1dc0: 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a  1 VALUES(5, 5);.
1dd0: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44    ANALYZE;.  UPD
1de0: 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ATE sqlite_stat3
1df0: 20 53 45 54 20 73 61 6d 70 6c 65 20 3d 20 58 27   SET sample = X'
1e00: 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  ' WHERE rowid = 
1e10: 31 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c  1;.  ANALYZE sql
1e20: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 0a 0a 64  ite_master;.}..d
1e30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
1e40: 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20 73 71  .2 {.  UPDATE sq
1e50: 6c 69 74 65 5f 73 74 61 74 33 20 53 45 54 20 73  lite_stat3 SET s
1e60: 61 6d 70 6c 65 20 3d 20 58 27 46 46 46 46 27 3b  ample = X'FFFF';
1e70: 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  .  ANALYZE sqlit
1e80: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45  e_master;.  SELE
1e90: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1ea0: 52 45 20 61 20 3d 20 31 3b 0a 7d 20 7b 31 20 31  RE a = 1;.} {1 1
1eb0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1ec0: 73 74 20 37 2e 33 20 7b 0a 20 20 41 4e 41 4c 59  st 7.3 {.  ANALY
1ed0: 5a 45 3b 0a 20 20 55 50 44 41 54 45 20 73 71 6c  ZE;.  UPDATE sql
1ee0: 69 74 65 5f 73 74 61 74 33 20 53 45 54 20 6e 65  ite_stat3 SET ne
1ef0: 71 20 3d 20 27 30 20 30 20 30 27 3b 0a 20 20 41  q = '0 0 0';.  A
1f00: 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
1f10: 73 74 65 72 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ster;.  SELECT *
1f20: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1f30: 20 3d 20 31 3b 0a 7d 20 7b 31 20 31 7d 0a 0a 64   = 1;.} {1 1}..d
1f40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
1f50: 2e 34 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a  .4 {.  ANALYZE;.
1f60: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
1f70: 73 74 61 74 33 20 53 45 54 20 6e 64 6c 74 20 3d  stat3 SET ndlt =
1f80: 20 27 30 20 30 20 30 27 3b 0a 20 20 41 4e 41 4c   '0 0 0';.  ANAL
1f90: 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
1fa0: 72 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  r;.  SELECT * FR
1fb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
1fc0: 33 3b 0a 7d 20 7b 33 20 33 7d 0a 0a 64 6f 5f 65  3;.} {3 3}..do_e
1fd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 35 20  xecsql_test 7.5 
1fe0: 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55  {.  ANALYZE;.  U
1ff0: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61  PDATE sqlite_sta
2000: 74 33 20 53 45 54 20 6e 6c 74 20 3d 20 27 30 20  t3 SET nlt = '0 
2010: 30 20 30 27 3b 0a 20 20 41 4e 41 4c 59 5a 45 20  0 0';.  ANALYZE 
2020: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
2030: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2040: 31 20 57 48 45 52 45 20 61 20 3d 20 35 3b 0a 7d  1 WHERE a = 5;.}
2050: 20 7b 35 20 35 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   {5 5}..#-------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f  --.#.reset_db.do
20b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e  _execsql_test 8.
20c0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
20d0: 4c 45 20 74 31 28 78 20 54 45 58 54 29 3b 0a 20  LE t1(x TEXT);. 
20e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
20f0: 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 49 4e 53   ON t1(x);.  INS
2100: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2110: 45 53 28 27 31 27 29 3b 0a 20 20 49 4e 53 45 52  ES('1');.  INSER
2120: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2130: 28 27 32 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ('2');.  INSERT 
2140: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
2150: 33 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  3');.  INSERT IN
2160: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 34 27  TO t1 VALUES('4'
2170: 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 7d 0a  );.  ANALYZE;.}.
2180: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2190: 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  8.2 {.  SELECT *
21a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
21b0: 20 3d 20 33 3b 0a 7d 20 7b 33 7d 0a 0a 23 2d 2d   = 3;.} {3}..#--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f  -------.#.reset_
2210: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
2220: 73 74 20 39 2e 31 20 7b 0a 20 20 43 52 45 41 54  st 9.1 {.  CREAT
2230: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
2240: 20 63 2c 20 64 2c 20 65 29 3b 0a 20 20 43 52 45   c, d, e);.  CRE
2250: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
2260: 74 31 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a  t1(a, b, c, d);.
2270: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
2280: 32 20 4f 4e 20 74 31 28 65 29 3b 0a 7d 0a 64 6f  2 ON t1(e);.}.do
2290: 5f 74 65 73 74 20 39 2e 32 20 7b 0a 20 20 65 78  _test 9.2 {.  ex
22a0: 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20 66  ecsql BEGIN;.  f
22b0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
22c0: 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d   < 100} {incr i}
22d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
22e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
22f0: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 2c 20  ALUES('x', 'y', 
2300: 27 7a 27 2c 20 24 69 2c 20 5b 65 78 70 72 20 24  'z', $i, [expr $
2310: 69 2f 32 5d 29 22 0a 20 20 7d 0a 20 20 66 6f 72  i/2])".  }.  for
2320: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
2330: 20 32 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a   20} {incr i} {.
2340: 20 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53      execsql "INS
2350: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2360: 45 53 28 27 78 27 2c 20 27 79 27 2c 20 27 7a 27  ES('x', 'y', 'z'
2370: 2c 20 31 30 31 2c 20 24 69 29 22 0a 20 20 7d 0a  , 101, $i)".  }.
2380: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 30 32    for {set i 102
2390: 7d 20 7b 24 69 20 3c 20 32 30 30 7d 20 7b 69 6e  } {$i < 200} {in
23a0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
23b0: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
23c0: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20   t1 VALUES('x', 
23d0: 27 79 27 2c 20 27 7a 27 2c 20 24 69 2c 20 5b 65  'y', 'z', $i, [e
23e0: 78 70 72 20 24 69 2f 32 5d 29 22 0a 20 20 7d 0a  xpr $i/2])".  }.
23f0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
2400: 0a 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59  .  execsql ANALY
2410: 5a 45 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 71 70 5f  ZE.} {}..do_eqp_
2420: 74 65 73 74 20 39 2e 33 2e 31 20 7b 0a 20 20 53  test 9.3.1 {.  S
2430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2440: 57 48 45 52 45 20 61 3d 27 78 27 20 41 4e 44 20  WHERE a='x' AND 
2450: 62 3d 27 79 27 20 41 4e 44 20 63 3d 27 7a 27 20  b='y' AND c='z' 
2460: 41 4e 44 20 64 3d 31 30 31 20 41 4e 44 20 65 3d  AND d=101 AND e=
2470: 35 3b 0a 7d 20 7b 2f 74 31 20 55 53 49 4e 47 20  5;.} {/t1 USING 
2480: 49 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71  INDEX i1/}.do_eq
2490: 70 5f 74 65 73 74 20 39 2e 33 2e 32 20 7b 0a 20  p_test 9.3.2 {. 
24a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
24b0: 31 20 57 48 45 52 45 20 61 3d 27 78 27 20 41 4e  1 WHERE a='x' AN
24c0: 44 20 62 3d 27 79 27 20 41 4e 44 20 63 3d 27 7a  D b='y' AND c='z
24d0: 27 20 41 4e 44 20 64 3d 39 39 20 41 4e 44 20 65  ' AND d=99 AND e
24e0: 3d 35 3b 0a 7d 20 7b 2f 74 31 20 55 53 49 4e 47  =5;.} {/t1 USING
24f0: 20 49 4e 44 45 58 20 69 31 2f 7d 0a 0a 73 65 74   INDEX i1/}..set
2500: 20 76 61 6c 75 65 5f 64 20 5b 65 78 70 72 20 31   value_d [expr 1
2510: 30 31 5d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  01].do_eqp_test 
2520: 39 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  9.4.1 {.  SELECT
2530: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2540: 20 61 3d 27 78 27 20 41 4e 44 20 62 3d 27 79 27   a='x' AND b='y'
2550: 20 41 4e 44 20 63 3d 27 7a 27 20 41 4e 44 20 64   AND c='z' AND d
2560: 3d 24 76 61 6c 75 65 5f 64 20 41 4e 44 20 65 3d  =$value_d AND e=
2570: 35 0a 7d 20 7b 2f 74 31 20 55 53 49 4e 47 20 49  5.} {/t1 USING I
2580: 4e 44 45 58 20 69 31 2f 7d 0a 73 65 74 20 76 61  NDEX i1/}.set va
2590: 6c 75 65 5f 64 20 5b 65 78 70 72 20 39 39 5d 0a  lue_d [expr 99].
25a0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 39 2e 34 2e  do_eqp_test 9.4.
25b0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
25c0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 27  ROM t1 WHERE a='
25d0: 78 27 20 41 4e 44 20 62 3d 27 79 27 20 41 4e 44  x' AND b='y' AND
25e0: 20 63 3d 27 7a 27 20 41 4e 44 20 64 3d 24 76 61   c='z' AND d=$va
25f0: 6c 75 65 5f 64 20 41 4e 44 20 65 3d 35 0a 7d 20  lue_d AND e=5.} 
2600: 7b 2f 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58  {/t1 USING INDEX
2610: 20 69 31 2f 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   i1/}..#--------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 74  -.# Check that t
2670: 68 65 20 70 6c 61 6e 6e 65 72 20 74 61 6b 65 73  he planner takes
2680: 20 73 74 61 74 33 20 64 61 74 61 20 69 6e 74 6f   stat3 data into
2690: 20 61 63 63 6f 75 6e 74 20 77 68 65 6e 20 63 6f   account when co
26a0: 6e 73 69 64 65 72 69 6e 67 0a 23 20 22 49 53 20  nsidering.# "IS 
26b0: 4e 55 4c 4c 22 20 61 6e 64 20 22 49 53 20 4e 4f  NULL" and "IS NO
26c0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
26d0: 6e 74 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  nts..#.do_execsq
26e0: 6c 5f 74 65 73 74 20 31 30 2e 31 2e 31 20 7b 0a  l_test 10.1.1 {.
26f0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
2700: 45 58 49 53 54 53 20 74 33 3b 0a 20 20 43 52 45  EXISTS t3;.  CRE
2710: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
2720: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  b);.  CREATE IND
2730: 45 58 20 74 33 61 20 4f 4e 20 74 33 28 61 29 3b  EX t3a ON t3(a);
2740: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2750: 74 33 62 20 4f 4e 20 74 33 28 62 29 3b 0a 7d 0a  t3b ON t3(b);.}.
2760: 64 6f 5f 74 65 73 74 20 31 30 2e 31 2e 32 20 7b  do_test 10.1.2 {
2770: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d  .  for {set i 1}
2780: 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63   {$i < 100} {inc
2790: 72 20 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24  r i} {.    if {$
27a0: 69 3e 39 30 7d 20 7b 20 73 65 74 20 61 20 24 69  i>90} { set a $i
27b0: 20 7d 20 65 6c 73 65 20 7b 20 73 65 74 20 61 20   } else { set a 
27c0: 4e 55 4c 4c 20 7d 0a 20 20 20 20 73 65 74 20 62  NULL }.    set b
27d0: 20 5b 65 78 70 72 20 24 69 20 25 20 35 5d 0a 20   [expr $i % 5]. 
27e0: 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45     execsql "INSE
27f0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
2800: 53 28 24 61 2c 20 24 62 29 22 0a 20 20 7d 0a 20  S($a, $b)".  }. 
2810: 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45   execsql ANALYZE
2820: 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  .} {}.do_eqp_tes
2830: 74 20 31 30 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  t 10.1.3 {.  SEL
2840: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48  ECT * FROM t3 WH
2850: 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 41 4e  ERE a IS NULL AN
2860: 44 20 62 20 3d 20 32 0a 7d 20 7b 2f 74 33 20 55  D b = 2.} {/t3 U
2870: 53 49 4e 47 20 49 4e 44 45 58 20 74 33 62 2f 7d  SING INDEX t3b/}
2880: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 30 2e  .do_eqp_test 10.
2890: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  1.4 {.  SELECT *
28a0: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 61   FROM t3 WHERE a
28b0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44   IS NOT NULL AND
28c0: 20 62 20 3d 20 32 0a 7d 20 7b 2f 74 33 20 55 53   b = 2.} {/t3 US
28d0: 49 4e 47 20 49 4e 44 45 58 20 74 33 61 2f 7d 0a  ING INDEX t3a/}.
28e0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
2930: 65 63 6b 20 74 68 61 74 20 73 74 61 74 33 20 64  eck that stat3 d
2940: 61 74 61 20 69 73 20 75 73 65 64 20 63 6f 72 72  ata is used corr
2950: 65 63 74 6c 79 20 77 69 74 68 20 6e 6f 6e 2d 64  ectly with non-d
2960: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
2970: 0a 23 20 73 65 71 75 65 6e 63 65 73 2e 0a 23 0a  .# sequences..#.
2980: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 63 68 65  foreach {tn sche
2990: 6d 61 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20  ma} {.  1 {.    
29a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
29b0: 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  a COLLATE nocase
29c0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
29d0: 20 49 4e 44 45 58 20 74 34 61 20 4f 4e 20 74 34   INDEX t4a ON t4
29e0: 28 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (a);.    CREATE 
29f0: 49 4e 44 45 58 20 74 34 62 20 4f 4e 20 74 34 28  INDEX t4b ON t4(
2a00: 62 29 3b 0a 20 20 7d 0a 20 20 32 20 7b 0a 20 20  b);.  }.  2 {.  
2a10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2a20: 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  4(a, b);.    CRE
2a30: 41 54 45 20 49 4e 44 45 58 20 74 34 61 20 4f 4e  ATE INDEX t4a ON
2a40: 20 74 34 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f   t4(a COLLATE no
2a50: 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54  case);.    CREAT
2a60: 45 20 49 4e 44 45 58 20 74 34 62 20 4f 4e 20 74  E INDEX t4b ON t
2a70: 34 28 62 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20  4(b);.  }.} {.  
2a80: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
2a90: 20 20 64 6f 5f 74 65 73 74 20 31 31 2e 24 74 6e    do_test 11.$tn
2aa0: 2e 31 20 7b 20 65 78 65 63 73 71 6c 20 24 73 63  .1 { execsql $sc
2ab0: 68 65 6d 61 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f  hema } {}..  do_
2ac0: 74 65 73 74 20 31 31 2e 24 74 6e 2e 32 20 7b 0a  test 11.$tn.2 {.
2ad0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
2ae0: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
2af0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 69 66  cr i} {.      if
2b00: 20 7b 20 28 24 69 20 25 20 31 30 29 3d 3d 30 20   { ($i % 10)==0 
2b10: 7d 20 7b 20 73 65 74 20 61 20 41 42 43 20 7d 20  } { set a ABC } 
2b20: 65 6c 73 65 20 7b 20 73 65 74 20 61 20 44 45 46  else { set a DEF
2b30: 20 7d 0a 20 20 20 20 20 20 73 65 74 20 62 20 5b   }.      set b [
2b40: 65 78 70 72 20 24 69 20 25 20 35 5d 0a 20 20 20  expr $i % 5].   
2b50: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49       execsql { I
2b60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
2b70: 4c 55 45 53 28 24 61 2c 20 24 62 29 20 7d 0a 20  LUES($a, $b) }. 
2b80: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
2b90: 20 41 4e 41 4c 59 5a 45 0a 20 20 7d 20 7b 7d 0a   ANALYZE.  } {}.
2ba0: 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  .  do_eqp_test 1
2bb0: 31 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 53 45  1.$tn.3 {.    SE
2bc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
2bd0: 48 45 52 45 20 61 20 3d 20 27 64 65 66 27 20 41  HERE a = 'def' A
2be0: 4e 44 20 62 20 3d 20 33 3b 0a 20 20 7d 20 7b 2f  ND b = 3;.  } {/
2bf0: 74 34 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t4 USING INDEX t
2c00: 34 62 2f 7d 0a 0a 20 20 69 66 20 7b 24 74 6e 3d  4b/}..  if {$tn=
2c10: 3d 31 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 71  =1} {.    set sq
2c20: 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l "SELECT * FROM
2c30: 20 74 34 20 57 48 45 52 45 20 61 20 3d 20 27 61   t4 WHERE a = 'a
2c40: 62 63 27 20 41 4e 44 20 62 20 3d 20 33 3b 22 0a  bc' AND b = 3;".
2c50: 20 20 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20      do_eqp_test 
2c60: 31 31 2e 24 74 6e 2e 34 20 24 73 71 6c 20 7b 2f  11.$tn.4 $sql {/
2c70: 74 34 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t4 USING INDEX t
2c80: 34 61 2f 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  4a/}.  } else {.
2c90: 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45  .    set sql "SE
2ca0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
2cb0: 48 45 52 45 20 61 20 3d 20 27 61 62 63 27 20 43  HERE a = 'abc' C
2cc0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 41 4e  OLLATE nocase AN
2cd0: 44 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64 6f  D b = 3;".    do
2ce0: 5f 65 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e  _eqp_test 11.$tn
2cf0: 2e 35 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49  .5 $sql {/t4 USI
2d00: 4e 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 0a  NG INDEX t4a/}..
2d10: 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c      set sql "SEL
2d20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57 48  ECT * FROM t4 WH
2d30: 45 52 45 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f  ERE a COLLATE no
2d40: 63 61 73 65 20 3d 20 27 61 62 63 27 20 41 4e 44  case = 'abc' AND
2d50: 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64 6f 5f   b = 3;".    do_
2d60: 65 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e  eqp_test 11.$tn.
2d70: 36 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49 4e  6 $sql {/t4 USIN
2d80: 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 20 20  G INDEX t4a/}.  
2d90: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2de0: 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f 74 68  # Test that noth
2df0: 69 6e 67 20 75 6e 74 6f 77 61 72 64 20 68 61 70  ing untoward hap
2e00: 70 65 6e 73 20 69 66 20 74 68 65 20 73 74 61 74  pens if the stat
2e10: 33 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  3 table contains
2e20: 20 65 6e 74 72 69 65 73 0a 23 20 66 6f 72 20 69   entries.# for i
2e30: 6e 64 65 78 65 73 20 74 68 61 74 20 64 6f 20 6e  ndexes that do n
2e40: 6f 74 20 65 78 69 73 74 2e 20 4f 72 20 4e 55 4c  ot exist. Or NUL
2e50: 4c 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  L values in the 
2e60: 69 64 78 20 63 6f 6c 75 6d 6e 2e 0a 23 20 4f 72  idx column..# Or
2e70: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20   NULL values in 
2e80: 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
2e90: 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 72 6f 70   columns..#.drop
2ea0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
2eb0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31  xecsql_test 15.1
2ec0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2ed0: 45 20 78 31 28 61 2c 20 62 2c 20 55 4e 49 51 55  E x1(a, b, UNIQU
2ee0: 45 28 61 2c 20 62 29 29 3b 0a 20 20 49 4e 53 45  E(a, b));.  INSE
2ef0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
2f00: 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  S(1, 2);.  INSER
2f10: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
2f20: 28 33 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54  (3, 4);.  INSERT
2f30: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
2f40: 35 2c 20 36 29 3b 0a 20 20 41 4e 41 4c 59 5a 45  5, 6);.  ANALYZE
2f50: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2f60: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 56 41 4c  sqlite_stat3 VAL
2f70: 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  UES(NULL, NULL, 
2f80: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
2f90: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 64 62 20 63 6c  , NULL);.}.db cl
2fa0: 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74  ose.sqlite3 db t
2fb0: 65 73 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71  est.db.do_execsq
2fc0: 6c 5f 74 65 73 74 20 31 35 2e 32 20 7b 20 53 45  l_test 15.2 { SE
2fd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
2fe0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
2ff0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3000: 31 35 2e 33 20 7b 0a 20 20 49 4e 53 45 52 54 20  15.3 {.  INSERT 
3010: 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74 61 74  INTO sqlite_stat
3020: 33 20 56 41 4c 55 45 53 28 34 32 2c 20 34 32 2c  3 VALUES(42, 42,
3030: 20 34 32 2c 20 34 32 2c 20 34 32 2c 20 34 32 29   42, 42, 42, 42)
3040: 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c  ;.}.db close.sql
3050: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
3060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3070: 31 35 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20  15.4 { SELECT * 
3080: 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32 20 33  FROM x1 } {1 2 3
3090: 20 34 20 35 20 36 7d 0a 0a 64 6f 5f 65 78 65 63   4 5 6}..do_exec
30a0: 73 71 6c 5f 74 65 73 74 20 31 35 2e 35 20 7b 0a  sql_test 15.5 {.
30b0: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
30c0: 73 74 61 74 31 20 53 45 54 20 73 74 61 74 20 3d  stat1 SET stat =
30d0: 20 4e 55 4c 4c 3b 0a 7d 0a 64 62 20 63 6c 6f 73   NULL;.}.db clos
30e0: 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  e.sqlite3 db tes
30f0: 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t.db.do_execsql_
3100: 74 65 73 74 20 31 35 2e 36 20 7b 20 53 45 4c 45  test 15.6 { SELE
3110: 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b  CT * FROM x1 } {
3120: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 64 6f  1 2 3 4 5 6}..do
3130: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
3140: 2e 37 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a  .7 {.  ANALYZE;.
3150: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
3160: 73 74 61 74 31 20 53 45 54 20 74 62 6c 20 3d 20  stat1 SET tbl = 
3170: 27 6e 6f 20 73 75 63 68 20 74 62 6c 27 3b 0a 7d  'no such tbl';.}
3180: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
3190: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
31a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e  execsql_test 15.
31b0: 38 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  8 { SELECT * FRO
31c0: 4d 20 78 31 20 7d 20 7b 31 20 32 20 33 20 34 20  M x1 } {1 2 3 4 
31d0: 35 20 36 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  5 6}..do_execsql
31e0: 5f 74 65 73 74 20 31 35 2e 39 20 7b 0a 20 20 41  _test 15.9 {.  A
31f0: 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44 41 54 45  NALYZE;.  UPDATE
3200: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 53 45   sqlite_stat3 SE
3210: 54 20 6e 65 71 20 3d 20 4e 55 4c 4c 2c 20 6e 6c  T neq = NULL, nl
3220: 74 3d 4e 55 4c 4c 2c 20 6e 64 6c 74 3d 4e 55 4c  t=NULL, ndlt=NUL
3230: 4c 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71  L;.}.db close.sq
3240: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
3250: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3260: 20 31 35 2e 31 30 20 7b 20 53 45 4c 45 43 54 20   15.10 { SELECT 
3270: 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32  * FROM x1 } {1 2
3280: 20 33 20 34 20 35 20 36 7d 0a 0a 23 20 54 68 69   3 4 5 6}..# Thi
3290: 73 20 69 73 20 6a 75 73 74 20 66 6f 72 20 63 6f  s is just for co
32a0: 76 65 72 61 67 65 2e 2e 2e 2e 0a 64 6f 5f 65 78  verage.....do_ex
32b0: 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 31  ecsql_test 15.11
32c0: 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20   {.  ANALYZE;.  
32d0: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74  UPDATE sqlite_st
32e0: 61 74 31 20 53 45 54 20 73 74 61 74 20 3d 20 73  at1 SET stat = s
32f0: 74 61 74 20 7c 7c 20 27 20 75 6e 6f 72 64 65 72  tat || ' unorder
3300: 65 64 27 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  ed';.}.db close.
3310: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
3320: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
3330: 73 74 20 31 35 2e 31 32 20 7b 20 53 45 4c 45 43  st 15.12 { SELEC
3340: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31  T * FROM x1 } {1
3350: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 2d 2d   2 3 4 5 6}..#--
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
33b0: 68 61 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  hat allocations 
33c0: 75 73 65 64 20 66 6f 72 20 73 71 6c 69 74 65 5f  used for sqlite_
33d0: 73 74 61 74 33 20 73 61 6d 70 6c 65 73 20 61 72  stat3 samples ar
33e0: 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 23 20  e included in.# 
33f0: 74 68 65 20 71 75 61 6e 74 69 74 79 20 72 65 74  the quantity ret
3400: 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  urned by SQLITE_
3410: 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f  DBSTATUS_SCHEMA_
3420: 55 53 45 44 2e 0a 23 0a 73 65 74 20 6f 6e 65 20  USED..#.set one 
3430: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
3440: 20 31 30 30 30 5d 0a 73 65 74 20 74 77 6f 20 5b   1000].set two [
3450: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
3460: 32 30 30 30 5d 0a 64 6f 5f 74 65 73 74 20 31 36  2000].do_test 16
3470: 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  .1 {.  reset_db.
3480: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3490: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
34a0: 61 2c 20 55 4e 49 51 55 45 28 61 29 29 3b 0a 20  a, UNIQUE(a));. 
34b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
34c0: 31 20 56 41 4c 55 45 53 28 24 6f 6e 65 29 3b 0a  1 VALUES($one);.
34d0: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d      ANALYZE;.  }
34e0: 0a 20 20 73 65 74 20 6e 42 79 74 65 20 5b 6c 69  .  set nByte [li
34f0: 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 64 62  ndex [sqlite3_db
3500: 5f 73 74 61 74 75 73 20 64 62 20 53 43 48 45 4d  _status db SCHEM
3510: 41 5f 55 53 45 44 20 30 5d 20 31 5d 0a 0a 20 20  A_USED 0] 1]..  
3520: 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
3530: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
3540: 54 41 42 4c 45 20 74 31 28 61 2c 20 55 4e 49 51  TABLE t1(a, UNIQ
3550: 55 45 28 61 29 29 3b 0a 20 20 20 20 49 4e 53 45  UE(a));.    INSE
3560: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3570: 53 28 24 74 77 6f 29 3b 0a 20 20 20 20 41 4e 41  S($two);.    ANA
3580: 4c 59 5a 45 3b 0a 20 20 7d 0a 20 20 73 65 74 20  LYZE;.  }.  set 
3590: 6e 42 79 74 65 32 20 5b 6c 69 6e 64 65 78 20 5b  nByte2 [lindex [
35a0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
35b0: 73 20 64 62 20 53 43 48 45 4d 41 5f 55 53 45 44  s db SCHEMA_USED
35c0: 20 30 5d 20 31 5d 0a 0a 20 20 65 78 70 72 20 7b   0] 1]..  expr {
35d0: 24 6e 42 79 74 65 32 20 3e 20 24 6e 42 79 74 65  $nByte2 > $nByte
35e0: 2b 39 35 30 20 26 26 20 24 6e 42 79 74 65 32 20  +950 && $nByte2 
35f0: 3c 20 24 6e 42 79 74 65 2b 31 30 35 30 7d 0a 7d  < $nByte+1050}.}
3600: 20 7b 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {1}..#---------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 0a 23 20 54 65 73 74 20 74 68 61 74 20 73 74 61  .# Test that sta
3660: 74 33 20 64 61 74 61 20 6d 61 79 20 62 65 20 75  t3 data may be u
3670: 73 65 64 20 77 69 74 68 20 70 61 72 74 69 61 6c  sed with partial
3680: 20 69 6e 64 65 78 65 73 2e 0a 23 0a 64 6f 5f 74   indexes..#.do_t
3690: 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 72 65 73  est 17.1 {.  res
36a0: 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
36b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
36c0: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64  LE t1(a, b, c, d
36d0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
36e0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
36f0: 62 29 20 57 48 45 52 45 20 64 20 49 53 20 4e 4f  b) WHERE d IS NO
3700: 54 20 4e 55 4c 4c 3b 0a 20 20 20 20 49 4e 53 45  T NULL;.    INSE
3710: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3720: 53 28 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 4e 55  S(-1, -1, -1, NU
3730: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
3740: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 32  INTO t1 SELECT 2
3750: 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46 52 4f  *a,2*b,2*c,d FRO
3760: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
3770: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3780: 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46 52  2*a,2*b,2*c,d FR
3790: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
37a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
37b0: 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46   2*a,2*b,2*c,d F
37c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
37d0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
37e0: 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20  T 2*a,2*b,2*c,d 
37f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
3800: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3810: 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64  CT 2*a,2*b,2*c,d
3820: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
3830: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3840: 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c  ECT 2*a,2*b,2*c,
3850: 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a  d FROM t1;.  }..
3860: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
3870: 7b 24 69 20 3c 20 33 32 7d 20 7b 69 6e 63 72 20  {$i < 32} {incr 
3880: 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
3890: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
38a0: 31 20 56 41 4c 55 45 53 28 24 69 25 32 2c 20 24  1 VALUES($i%2, $
38b0: 62 2c 20 24 69 2f 32 2c 20 27 61 62 63 27 29 20  b, $i/2, 'abc') 
38c0: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
38d0: 7b 41 4e 41 4c 59 5a 45 20 6d 61 69 6e 2e 74 31  {ANALYZE main.t1
38e0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 63 61 74 63 68  }.} {}..do_catch
38f0: 73 71 6c 5f 74 65 73 74 20 31 37 2e 31 2e 32 20  sql_test 17.1.2 
3900: 7b 0a 20 20 41 4e 41 4c 59 5a 45 20 74 65 6d 70  {.  ANALYZE temp
3910: 2e 74 31 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  .t1;.} {1 {no su
3920: 63 68 20 74 61 62 6c 65 3a 20 74 65 6d 70 2e 74  ch table: temp.t
3930: 31 7d 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74  1}}..do_eqp_test
3940: 20 31 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54   17.2 {.  SELECT
3950: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3960: 20 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41   d IS NOT NULL A
3970: 4e 44 20 61 3d 30 3b 0a 7d 20 7b 2f 55 53 49 4e  ND a=0;.} {/USIN
3980: 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f  G INDEX i1/}.do_
3990: 65 71 70 5f 74 65 73 74 20 31 37 2e 33 20 7b 0a  eqp_test 17.3 {.
39a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
39b0: 74 31 20 57 48 45 52 45 20 64 20 49 53 20 4e 4f  t1 WHERE d IS NO
39c0: 54 20 4e 55 4c 4c 20 41 4e 44 20 61 3d 30 3b 0a  T NULL AND a=0;.
39d0: 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20  } {/USING INDEX 
39e0: 69 31 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  i1/}..do_execsql
39f0: 5f 74 65 73 74 20 31 37 2e 34 20 7b 0a 20 20 43  _test 17.4 {.  C
3a00: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
3a10: 4e 20 74 31 28 63 29 20 57 48 45 52 45 20 64 20  N t1(c) WHERE d 
3a20: 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20 20 41  IS NOT NULL;.  A
3a30: 4e 41 4c 59 5a 45 20 6d 61 69 6e 2e 69 32 3b 0a  NALYZE main.i2;.
3a40: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 37  }.do_eqp_test 17
3a50: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
3a60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 64 20  FROM t1 WHERE d 
3a70: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  IS NOT NULL AND 
3a80: 61 3d 30 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49  a=0;.} {/USING I
3a90: 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70  NDEX i1/}.do_eqp
3aa0: 5f 74 65 73 74 20 31 37 2e 36 20 7b 0a 20 20 53  _test 17.6 {.  S
3ab0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3ac0: 57 48 45 52 45 20 64 20 49 53 20 4e 4f 54 20 4e  WHERE d IS NOT N
3ad0: 55 4c 4c 20 41 4e 44 20 61 3d 30 20 41 4e 44 20  ULL AND a=0 AND 
3ae0: 62 3d 30 20 41 4e 44 20 63 3d 31 30 3b 0a 7d 20  b=0 AND c=10;.} 
3af0: 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32  {/USING INDEX i2
3b00: 2f 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /}..#-----------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3b50: 0a 64 6f 5f 74 65 73 74 20 31 38 2e 31 20 7b 0a  .do_test 18.1 {.
3b60: 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65    reset_db.  exe
3b70: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
3b80: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
3b90: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
3ba0: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
3bb0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
3bc0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 39 7d 20  t i 0} {$i < 9} 
3bd0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
3be0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
3bf0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3c00: 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20  LUES($i, 0);.   
3c10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3c20: 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b  1 VALUES($i, 0);
3c30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3c40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
3c50: 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   0);.      INSER
3c60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3c70: 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49  ($i, 0);.      I
3c80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3c90: 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20  LUES($i, 0);.   
3ca0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3cb0: 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b  1 VALUES($i, 0);
3cc0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3cd0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
3ce0: 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   0);.      INSER
3cf0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3d00: 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49  ($i, 0);.      I
3d10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3d20: 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20  LUES($i, 0);.   
3d30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3d40: 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b  1 VALUES($i, 0);
3d50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3d60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
3d70: 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   0);.      INSER
3d80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3d90: 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49  ($i, 0);.      I
3da0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3db0: 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20  LUES($i, 0);.   
3dc0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3dd0: 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b  1 VALUES($i, 0);
3de0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3df0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
3e00: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
3e10: 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45   execsql ANALYZE
3e20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
3e30: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
3e40: 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 7d  M sqlite_stat3 }
3e50: 0a 7d 20 7b 39 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .} {9}..#-------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 0a 23 20 46 6f 72 20 63 6f 76 65 72 61 67  --.# For coverag
3eb0: 65 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 76  e..#.ifcapable v
3ec0: 69 65 77 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  iew {.  do_test 
3ed0: 31 39 2e 31 20 7b 0a 20 20 20 20 72 65 73 65 74  19.1 {.    reset
3ee0: 5f 64 62 20 0a 20 20 20 20 65 78 65 63 73 71 6c  _db .    execsql
3ef0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
3f00: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a  TABLE t1(x, y);.
3f10: 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44        CREATE IND
3f20: 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 79  EX i1 ON t1(x, y
3f30: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
3f40: 56 49 45 57 20 76 31 20 41 53 20 53 45 4c 45 43  VIEW v1 AS SELEC
3f50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3f60: 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20     ANALYZE;.    
3f70: 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70  }.  } {}.}.ifcap
3f80: 61 62 6c 65 20 61 75 74 68 20 7b 0a 20 20 70 72  able auth {.  pr
3f90: 6f 63 20 61 75 74 68 70 72 6f 63 20 7b 6f 70 20  oc authproc {op 
3fa0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b  args} {.    if {
3fb0: 24 6f 70 20 3d 3d 20 22 53 51 4c 49 54 45 5f 41  $op == "SQLITE_A
3fc0: 4e 41 4c 59 5a 45 22 7d 20 7b 20 72 65 74 75 72  NALYZE"} { retur
3fd0: 6e 20 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 20  n "SQLITE_DENY" 
3fe0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 53 51  }.    return "SQ
3ff0: 4c 49 54 45 5f 4f 4b 22 0a 20 20 7d 0a 20 20 64  LITE_OK".  }.  d
4000: 6f 5f 74 65 73 74 20 31 39 2e 32 20 7b 0a 20 20  o_test 19.2 {.  
4010: 20 20 72 65 73 65 74 5f 64 62 20 0a 20 20 20 20    reset_db .    
4020: 64 62 20 61 75 74 68 20 61 75 74 68 70 72 6f 63  db auth authproc
4030: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
4040: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
4050: 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20  E t1(x, y);.    
4060: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31    CREATE VIEW v1
4070: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
4080: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  M t1;.    }.    
4090: 63 61 74 63 68 73 71 6c 20 41 4e 41 4c 59 5a 45  catchsql ANALYZE
40a0: 0a 20 20 7d 20 7b 31 20 7b 6e 6f 74 20 61 75 74  .  } {1 {not aut
40b0: 68 6f 72 69 7a 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d  horized}}.}..#--
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f  -------.#.reset_
4110: 64 62 0a 70 72 6f 63 20 72 20 7b 61 72 67 73 7d  db.proc r {args}
4120: 20 7b 20 65 78 70 72 20 72 61 6e 64 28 29 20 7d   { expr rand() }
4130: 0a 64 62 20 66 75 6e 63 20 72 20 72 0a 64 62 20  .db func r r.db 
4140: 66 75 6e 63 20 6c 72 61 6e 67 65 20 6c 72 61 6e  func lrange lran
4150: 67 65 0a 64 6f 5f 74 65 73 74 20 32 30 2e 31 20  ge.do_test 20.1 
4160: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4170: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4180: 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
4190: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
41a0: 4f 4e 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  ON t1(a,b,c,d);.
41b0: 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69    }.  for {set i
41c0: 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69   0} {$i < 16} {i
41d0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
41e0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
41f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4200: 45 53 28 24 69 2c 20 72 28 29 2c 20 72 28 29 2c  ES($i, r(), r(),
4210: 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53   r());.      INS
4220: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4230: 45 53 28 24 69 2c 20 24 69 2c 20 20 72 28 29 2c  ES($i, $i,  r(),
4240: 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53   r());.      INS
4250: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4260: 45 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20  ES($i, $i,  $i, 
4270: 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53   r());.      INS
4280: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4290: 45 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20  ES($i, $i,  $i, 
42a0: 20 24 69 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   $i);.      INSE
42b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
42c0: 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20  S($i, $i,  $i,  
42d0: 24 69 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  $i);.      INSER
42e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
42f0: 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20 72  ($i, $i,  $i,  r
4300: 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ());.      INSER
4310: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4320: 28 24 69 2c 20 24 69 2c 20 20 72 28 29 2c 20 72  ($i, $i,  r(), r
4330: 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ());.      INSER
4340: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4350: 28 24 69 2c 20 72 28 29 2c 20 72 28 29 2c 20 72  ($i, r(), r(), r
4360: 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ());.    }.  }.}
4370: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
4380: 65 73 74 20 32 30 2e 32 20 7b 20 41 4e 41 4c 59  est 20.2 { ANALY
4390: 5a 45 20 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20  ZE }.for {set i 
43a0: 30 7d 20 7b 24 69 3c 31 36 7d 20 7b 69 6e 63 72  0} {$i<16} {incr
43b0: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 61   i} {.    set va
43c0: 6c 20 24 69 0a 20 20 20 20 64 6f 5f 65 78 65 63  l $i.    do_exec
43d0: 73 71 6c 5f 74 65 73 74 20 32 30 2e 33 2e 24 69  sql_test 20.3.$i
43e0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
43f0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
4400: 6c 69 74 65 5f 73 74 61 74 33 20 57 48 45 52 45  lite_stat3 WHERE
4410: 20 73 61 6d 70 6c 65 3d 24 76 61 6c 0a 20 20 20   sample=$val.   
4420: 20 7d 20 7b 31 7d 0a 7d 0a 0a 66 69 6e 69 73 68   } {1}.}..finish
4430: 5f 74 65 73 74 0a                                _test.